在功能环境中提供列表内容

时间:2017-01-14 11:33:57

标签: r

为了避免创建具有定义单个对象设置的许多参数的R函数,我将它们收集在列表中,

list_my_obj <- list("var1" = ..., "var2" = ..., ..., "varN" = ...)
class(list_my_obj) <- "my_obj"

然后我定义了接受这样一个列表作为参数的函数,并在函数范围中注入列表的元素:

my_fun <- function(list_my_obj) {

  stopifnot(class(list_my_obj) == "my_obj")

  list2env(list_my_obj, envir=environment())
  rm(list_my_obj)

  var_sum <- var1 + var2
  (...)

}

在函数范围中注入列表的元素允许我避免在函数后面用list_my_obj$var1, list_my_obj$var2等调用它们,这会降低代码的可读性。

这个解决方案非常合适,但是在运行R CMD check时会产生一个音符,说&#34;没有可见的全局变量绑定&#34; var1, var2, ... varN

为了避免这样的笔记,人们可以在函数体的开头创建新的变量&#34;手工&#34;对于列表中的每个元素:

var1 <- list_my_obj$var1
(...)
varN <- list_my_obj$varN

但我想避免这种情况,因为N可能很大。

关于如何在这种情况下抑制R CMD检查笔记的更好的解决方案或想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试with(或within):

f <- function(x) {
   stopifnot(inherits(x, "my_obj"))
   with(x, {
      # ...
      var_sum <- var1 + var2
      # ...
      var_sum
   })
}

my_obj <- structure(list(var1 = 1, var2 = 2), class = "my_obj")
f(my_obj)

答案 1 :(得分:0)

为此创建了函数list2env,例如:

list2env(list_my_obj, env = environment())