有没有办法输出例如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)
我找到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)
该return()
对象必须是一件事......一个list
或一个vector
。由于列表可以是“一件事”,并且列表可以包含许多类的许多内容,因此您需要初始化一个列表结构,然后将内容推入其中,直到您准备好将该结构重新运行到调用环境。
如果您想将单个项目“推送”到全局(或其他环境)中,您可以使用<<-
或assign
,尽管这被认为是丑陋的做法并且违反了函数式编程的范式。