【问题标题】: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年就确定是重复问题了?
  • 您无需亲自处理,StackOverflow 中有许多重复项,关闭和标记重复项有助于保持网站清洁并参考相关问题。由于有很多重复,并且所有的审查可能需要很长时间,所以并不总是立即关闭。
  • 感谢@BinyaminSharet 的反馈

标签: r


【解决方案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() 为您提供当前范围(即存储局部变量的位置)。这是最终对我帮助最大的答案:stackoverflow.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
    

    【讨论】:

      猜你喜欢
      • 2017-07-21
      • 2020-05-27
      • 1970-01-01
      • 2017-09-10
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2013-05-02
      相关资源
      最近更新 更多