【问题标题】:How to return elements of R list as independent objects in function environment?如何在函数环境中将 R 列表的元素作为独立对象返回?
【发布时间】:2016-11-16 01:44:42
【问题描述】:

类似于这个问题:

Return elements of list as independent objects in global environment

当在函数内部调用 list2env 时,我似乎无法调整答案来分配列表元素:

例如

lst <- list(a = c(1, 2), b = c(3, 4))

tmp_fn <- function(lst) {
    # do computations on list elements
    # first assign each to the function environment
    list2env(lst, parent = parent.frame()) # fails

    # do stuff
    ...
}

我认为parent = parent.frame() 可以工作,但在调试tmp_fn 时,我只看到lst 作为列表分配给函数环境,而不是单个变量ab

【问题讨论】:

  • 也许你只是想在你的函数中attach(lst)pos 参数可能更友好,我认为默认的 2L 可以满足您的需求。
  • 我以为attach不推荐?
  • attach 不推荐,但您正在尝试做attach 所做的事情。一般建议是使用您的list

标签: r


【解决方案1】:

1) 在这里使用envir=,而不是像这样使用parent=。此外,如图所示,您可能希望添加 envir 作为灵活性参数:

lst <- list(a = c(1, 2), b = c(3, 4))

tmp_fn <- function(lst, envir = parent.frame()) {
    invisible(list2env(lst, envir = envir))
}
tmp_fn(lst)

2) 另一种可能性是使用 gsubfn 包中的list[...]&lt;-(开发版):

devtools::install_github("ggrothendieck/gsubfn")
library(gsubfn)

func <- function(lst) lst
list[a, b] <- func(lst)

现在ab 将在当前环境中。

【讨论】:

  • 我已经尝试过您的第一个解决方案,谢谢。看来您可能稍微误解了我的问题。我不想要一个函数tmp_fn 将列表对象分配到tmp_fn 的调用环境中。相反,我希望在调用时将元素分配到tmp_fn 的环境中。您的解决方案仍然有效,因为我可以做类似的事情。 tmp_fn2 &lt;- function(lst){tmp_fn1(lst)},它确实将lst 元素分配到tmp_fn2 的函数环境中。但是,我想知道是否有更直接的方法可以在不定义另一个函数的情况下执行此操作。
  • 您可以将envir 指定为您想要的任何内容。例如,将envir的默认值定义为envir=parent.env(environment())而不是envir=parent.frame()
猜你喜欢
  • 2019-08-31
  • 2023-04-02
  • 2019-06-29
  • 2019-07-10
  • 2012-10-13
  • 2018-06-15
  • 1970-01-01
  • 2019-11-14
相关资源
最近更新 更多