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

Gag*_*lva 17 r

有没有办法输出例如2个对象而不使用list()

my.fun=function(vector, index)
       {
       a=fun.a(vector, index)
       b=fun.b(vector, index)
       output=list(a,b)
       }
Run Code Online (Sandbox Code Playgroud)

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

       c=fun.a(vector, index)
       d=fun.b(vector, index)
Run Code Online (Sandbox Code Playgroud)

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

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

Jos*_*ich 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
Run Code Online (Sandbox Code Playgroud)


Dar*_*ook 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"
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 5

return()对象必须是一件事......一个list或一个vector。由于列表可以是“一件事”,并且列表可以包含许多类的许多内容,因此您需要初始化一个列表结构,然后将内容推入其中,直到您准备好将该结构重新运行到调用环境。

如果您想将单个项目“推送”到全局(或其他环境)中,您可以使用<<-assign,尽管这被认为是丑陋的做法并且违反了函数式编程的范式。