2011-11-21 30 views
16

有没有办法输出例如2个物体没有使用list()如何从具有多个输出的功能分配?

my.fun=function(vector, index) 
     { 
     a=fun.a(vector, index) 
     b=fun.b(vector, index) 
     output=list(a,b) 
     } 

或者输出2个对象列表?考虑到我还可以有:

 c=fun.a(vector, index) 
     d=fun.b(vector, index) 

,并希望list(a,b),另一个list(c,d)相同功能。

这只是我正在寻找的一个小例子,我的函数应用于大对象,并将它们导出为列表,但是我想导出也是中间值计算。一种选择是将所有列在同一个列表中,但我想知道是否还有其他解决方案。

+1

会议决定,这是一个重复的问题1今年才问之后? –

+1

你不需要亲自采取它,在StackOverflow中有很多重复项,并且关闭和标记重复项有助于保持站点更清洁并引用相关问题。由于有很多重复,并且所有这些重复的审查可能需要很长时间,所以并不总是立即关闭。 – MByD

+1

感谢您的反馈@BinyaminSharet –

回答

6

我发现list2env非常适合你描述;最棘手的位,对我来说,是工作出什么给了env参数:

f=function(){ 
    list(a=1,b="my string") 
} 

ret=f() 
list2env(ret,env=environment()) 
#a=ret$a;b=ret$b #Same as previous line 

print(a);print(b) #1 and "my string" 
+0

你可能会也可能不想使用'environment()'。它在这种情况下返回全球环境,但仅仅是因为它是当前的评估环境。 –

+0

为了扩展@Jos​​huaUlrich所写的内容,environment()为您提供了当前的范围(即您的本地变量的存储位置)。这是最终帮助我的SO回答:http://stackoverflow.com/a/8773047/841830 –

3

我相信你仅限于使用列表,但你可以将它们组合起来,如:

> list(list(a=1, b=2), list(c=3, d=4)) 
[[1]] 
[[1]]$a 
[1] 1 

[[1]]$b 
[1] 2 


[[2]] 
[[2]]$c 
[1] 3 

[[2]]$d 
[1] 4 
3

()的返回对象必须是一件事......一个列表或向量。如果你想“推”东西进入全球(或其他环境),可以使用“< < - ”或类似的eval(...,ENVIR = .GlobalEnv)

9

你只能在return一个对象一个函数。但是你有其他的选择。您可以将中间对象分配给全局环境(您需要注意不要覆盖任何东西),或者可以将环境传递给您的函数并为其分配对象。

这里是后者的建议的例子:

fun <- function(x, env) { 
    env$x2 <- x^2 
    x^3 
} 
set.seed(21) 
x <- rnorm(10) 
myEnv <- new.env() 
fun(x, myEnv) 
# [1] 4.987021e-01 1.424421e-01 5.324742e+00 -2.054855e+00 1.061014e+01 
# [6] 8.125632e-02 -3.871369e+00 -8.171530e-01 2.559674e-04 -1.370917e-08 
myEnv$x2 
# [1] 6.288699e-01 2.727464e-01 3.049292e+00 1.616296e+00 4.828521e+00 
# [6] 1.876023e-01 2.465527e+00 8.740486e-01 4.031405e-03 5.728058e-06 
+0

+1起初,我想,“嘿,那是我的答案”,然后意识到你的版本比我的结构更好,思路更深。 –

+0

@DWin:是的,我在写我的时候看到了你的回答,并辩论是否发帖(因为他们很相似)。但是后来我认为让别人听到以不同方式解释的相同内容可能会有帮助。 –