如何从具有多个输出的功能中分配?

时间:2011-11-21 18:15:31

标签: r

有没有办法输出,例如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)用于相同的功能。

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

4 个答案:

答案 0 :(得分:10)

你只能在一个函数中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

答案 1 :(得分:8)

我发现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"

答案 2 :(得分: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 :(得分:3)

return()对象需要是一件事...... listvector。如果你想把其他东西“推”到全局(或其他环境),你可以使用<<-,虽然这被认为是不好的做法。