如何从具有多个输出的功能分配? [复制]

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() 对象必须是一回事……listvector。由于列表可以是“一件事”,并且列表可以包含许多类的许多事物,因此您需要做的就是初始化列表结构,然后将内容推入其中,直到您准备好将该结构重新运行到调用环境为止。

如果您想将单个项目“推送”到全局(或其他环境)中,您可以使用 <<-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()。在这种情况下,它返回全局环境,但这只是因为它是当前的评估环境。 为了扩展@Jos​​huaUlrich 所写的内容, 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复制到日志文件?

如何从 Matlab 调用具有多个输出的 C++ 函数?

如何使用多个输出参数执行存储过程?

如何将 Bash 命令的输出分配给变量? [复制]

如何将插入的输出值分配给 sql server 中的变量? [复制]

从每个键具有多个值的字典中将数据写入 csv