如何在 R 中创建一个包含 n 个用户输入对象(即 `...` )的列表来处理不存在的对象?

How can I create a list of n user input objects (i.e. `...` ) in R which handles objects which do not exist?

我正在尝试编写一个接受任意数量的对象并将它们 return 放入列表中的函数。它应该为不存在的对象显示警告,但 return 确实存在的对象的列表。

这是一个例子。

a <-  data.frame(A = 1:2)
b <- 4
c <- list(5,4,3)


f <- function(...) {
    
    list(...)
}
# Function returns a list(a,b,c)
f(a,b,c)
# Function errors as d does not exist
# Error in test(a, b, c, d): object 'd' not found
f(a, b, c, d)

我想修改 f,这样 f(a, b, c, d) 的函数 returns list(a,b,c) 加上警告说 d 不存在。

我不知道 R 什么时候试图找到 d,但我一直在想检查哪些对象存在并将列表子集化为那些存在的对象。

list_in <- list(...)
list_in[[(sapply(..., exists))]]

但错误似乎发生在 R 甚至开始尝试 运行 函数代码之前?

我建议不要使用这样的函数。拥有一个在调用不存在的变量时不会抛出错误的函数不是好的做法。它不是惯用的 R,并且很容易通过简单的拼写错误导致重大问题。

此版本在直接传递数字或字符或表达式时也不起作用,例如 f(1 + 1, "hello", a),但可以通过一些工作来实现。

f <- function(...) {
  all_vars <- as.list(match.call())[-1]
  all_names <- sapply(all_vars, is.name)
  if(any(!all_names)) stop("Only named objects can be passed to function f")
  var_names <- sapply(all_vars, as.character)
  var_exists <- sapply(var_names, exists)
  if(any(!var_exists))
  {
    warning("Variables ", paste(var_names[!var_exists], collapse = ", "),
            " were not found in the search path.")
  }
  
  lapply(var_names[var_exists], get, env = parent.frame())
}

所以,例如。

a <-  data.frame(A = 1:2)
b <- 4
c <- list(5,4,3)

f(a, b, c, d, e)
#> [[1]]
#>   A
#> 1 1
#> 2 2
#> 
#> [[2]]
#> [1] 4
#> 
#> [[3]]
#> [[3]][[1]]
#> [1] 5
#> 
#> [[3]][[2]]
#> [1] 4
#> 
#> [[3]][[3]]
#> [1] 3

#> Warning message:
#> In f(a, b, c, d, e) : Variables d, e were not found in the search path.