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

时间:2020-03-03 12:01:35

标签: r

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

这是我正在尝试做的一个小例子。我想返回在此函数中分配的所有值(davemarkxxz(如果存在))。打印声明是多余的。

我通常甚至不会尝试执行此操作,只是我将source d文件转换为函数,并且以前所有对象都源于全局环境,这仍然是我需要的,而且我宁愿不要在函数末尾创建一个包含所有对象的庞大列表。 理想情况下,运行该函数后,所有对象都位于全局环境中,并且可以从列表中进行访问。 (自动将其除名并将其保留为独立对象会很棒。)也许这应该是一个类?

如果其中任何一个为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-03-03创建

1 个答案:

答案 0 :(得分:4)

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

从字面上看,有 1

as.list(environment())

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

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

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

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