如何在 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.
我正在尝试编写一个接受任意数量的对象并将它们 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.