如何从具有多个输出的功能分配? [复制]
Posted
技术标签:
【中文标题】如何从具有多个输出的功能分配? [复制]【英文标题】:How to assign from a function with multiple outputs? [duplicate] 【发布时间】:2012-01-03 05:26:45 【问题描述】:有没有办法输出例如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年就确定是重复问题了? 您无需亲自处理,*** 中有许多重复项,关闭和标记重复项有助于保持网站清洁并参考相关问题。由于有很多重复,并且所有的审查可能需要很长时间,所以并不总是立即关闭。 感谢@BinyaminSharet 的反馈 【参考方案1】:return()
对象必须是一回事……list
或 vector
。由于列表可以是“一件事”,并且列表可以包含许多类的许多事物,因此您需要做的就是初始化列表结构,然后将内容推入其中,直到您准备好将该结构重新运行到调用环境为止。
如果您想将单个项目“推送”到全局(或其他环境)中,您可以使用 <<-
或 assign
,尽管这被认为是丑陋的做法并且违反了函数式编程的范式。
【讨论】:
【参考方案2】:我发现 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"
【讨论】:
您可能想也可能不想使用environment()
。在这种情况下,它返回全局环境,但这只是因为它是当前的评估环境。
为了扩展@JoshuaUlrich 所写的内容, environment() 为您提供当前范围(即存储局部变量的位置)。这是最终对我帮助最大的答案:***.com/a/8773047/841830【参考方案3】:
一个函数中只能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 起初我想,“嘿,这就是我的答案”,然后意识到你的版本比我的更有条理,也更经过深思熟虑。 @DWin:是的,我在写我的时候看到了你的答案,并在争论是否要发布(因为它们很相似)。但后来我认为,听到以不同方式解释的同一件事可能会对某人有所帮助。【参考方案4】:我相信你仅限于使用列表,但你可以像这样组合它们:
> 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
【讨论】:
以上是关于如何从具有多个输出的功能分配? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用PowerShell将选择查询的输出从DataSet复制到日志文件?