有没有一种方法可以在R中返回函数中定义的所有对象?

3
有没有一种方法可以在R中返回函数中定义的所有对象?以下是我试图做的一个小例子。我想要返回我在这个函数中分配值的所有内容(dave,mark,xx,z(如果存在))。打印语句是多余的。
通常情况下,我不会尝试这样做,只是我正在将一个已经source过的文件转换为函数,并且之前所有的对象都被引入到全局环境中,这就是我仍然需要的,我宁愿不在函数结尾创建一个巨大的对象列表。理想情况下,在运行函数后,所有对象都在全局环境中,并且可以从列表中访问。(自动去除列表并将其留作独立对象将是很好的。)也许这应该是一个类?
如果其中任何一个是NULL,例如,在函数定义参数中提供y为NULL(即test_func <- function(x = c(1,2),y = NULL)...),则会出现错误。
test_func <- function(x = c(1, 2), y = 3) {
  xx <- x * x
  if(!is.null(y)) z <- x * y
  mark <- "hello"
  dave <- data.frame(x = x, xx = xx)
  whatshere <- ls()
  print(whatshere)
  whatsout <- list()
  for (i in 1:length(whatshere)) {
    whatsout[[i]] <- get(whatshere[[i]])
  }
  names(whatsout) <- whatshere
  return(whatsout)
}
test_func()
#> [1] "dave" "mark" "x"    "xx"   "y"    "z"
#> $dave
#>   x xx
#> 1 1  1
#> 2 2  4
#> 
#> $mark
#> [1] "hello"
#> 
#> $x
#> [1] 1 2
#> 
#> $xx
#> [1] 1 4
#> 
#> $y
#> [1] 3
#> 
#> $z
#> [1] 3 6

这段内容是由reprex软件包 (v0.3.0)在2020年03月03日创建的。


对于任何来到这个问题的人,Konrad的答案完美地解决了问题,我正在使用它将所有内容取消列入全局环境:x <- test_func(); for (i in 1:length(x)) { assign(names(x[i]), x[[i]]) }; rm(x) - undefined
1个回答

5

有没有办法在R中返回函数定义的所有对象?

字面上来说,是可以的1

as.list(environment())

然而,我通常不建议这样做:明确表达,单独命名你想要返回的所有对象:
list(
    foo = foo,
    bar = bar,
    …
)

1 这将包括参数,因为它们只是在局部定义的值。如果要排除正式参数,请进行以下操作:

values = as.list(environment())
values[setdiff(names(values), names(formals()))]

哇,太棒了,谢谢。是的,我完全同意,如果不是因为我自己陷入了这种情况,我甚至都不会想到这个。我的返回列表将会非常庞大。谢谢! - undefined
1
@RobertMyles 看到更新了吗,我忘记处理参数了。这样做会变得更混乱。 - undefined
...但好得多 :-)。这太棒了,Konrad,非常感谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接