【问题标题】:Is there any way to return all objects defined in a function in R?有没有办法返回 R 函数中定义的所有对象?
【发布时间】:2020-03-03 12:01:35
【问题描述】:

有什么方法可以返回 R 函数中定义的所有对象?

这是我正在尝试做的一个小例子。我想返回我在这个函数中赋值的所有东西(davemarkxxz(如果存在))。 print 语句是多余的。

通常我什至不会尝试这样做,只是我正在将sourced 文件转换为函数,而之前所有对象都来自全局环境,这是我仍然需要的,我'宁愿不在函数末尾创建一个包含所有对象的巨大列表。 理想情况下,运行函数后,所有对象都在全局环境中,并且可以从列表中访问。 (自动除名并将它们作为独立对象保留会很棒。)也许这应该是一个类?

如果其中任何一个是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 package (v0.3.0) 于 2020 年 3 月 3 日创建

【问题讨论】:

  • 对于任何提出这个问题的人,Konrad 的答案都非常有效,我正在使用它来将所有内容都排除在全球环境中:x &lt;- test_func();for (i in 1:length(x)) { assign(names(x[i]), x[[i]]) };rm(x)

标签: r


【解决方案1】:

有什么方法可以返回 R 函数中定义的所有对象?

从字面上看,有1

as.list(environment())

但是,我通常反对建议:明确,命名您要单独返回的所有对象:

list(
    foo = foo,
    bar = bar,
    …
)

1 这将包括参数,因为这些只是本地定义的值。要排除形式参数,请执行以下操作:

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

【讨论】:

  • 哦,太棒了,谢谢。是的,我完全同意,除非我发现自己处于这种情况,否则我什至不会想到这一点,而且我的返回名单将是巨大的。谢谢!
  • @RobertMyles 查看更新,我忘记处理参数了。这样做会让事情变得更加混乱。
  • ...但好多了:-)。太棒了,康拉德,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2020-03-03
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2016-03-07
相关资源
最近更新 更多