我正在编写一个包装器来按行组合任意数量的数据集。由于某些变量可能具有唯一变量,因此我首先要限制数据中的变量。
我的功能就像这样
rcombine <- function(List, Vars) {
List2 <- lapply(List, subset, select=Vars)
Reduce(rbind, List2)
}
当我直接运行代码时,它可以工作。但是在函数中,我的变量Vars
消失了。
例如:
x <- data.frame('a'=sample(LETTERS, 10), 'b'=sample(LETTERS, 10), 'c'=sample(LETTERS, 10))
y <- data.frame('a'=sample(LETTERS, 10), 'b'=sample(LETTERS, 10), 'e'=sample(LETTERS, 10))
rcombine(list(x, y), c('a', 'b'))
给了我:
Error in eval(expr, envir, enclos) : object 'Vars' not found
但正在运行:
List <- list(x, y)
Reduce(rbind, lapply(List, subset, select=c('a','b')))
作品。我可以从函数中打印Vars
,但在lapply
内它会消失。发生了什么事?
答案 0 :(得分:4)
subset
确实不应该用于这些类型的事情。从帮助页面
这是一种便于交互使用的便利功能。对于 编程最好使用标准的子集函数 [,特别是论证子集的非标准评估 可能会产生意想不到的后果。
对于您的特定问题,我不明白为什么直接使用“[”替换子集会是一个问题。
rcombine <- function(List, Vars) {
List2 <- lapply(List, "[", i= , j = Vars, drop = FALSE) # here is the change
Reduce(rbind, List2)
}
# alternatively...
rcombine <- function(List, Vars) {
List2 <- lapply(List, function(x){x[, Vars, drop = FALSE]}) # here is the change
Reduce(rbind, List2)
}
x <- data.frame('a'=sample(LETTERS, 10), 'b'=sample(LETTERS, 10), 'c'=sample(LETTERS, 10))
y <- data.frame('a'=sample(LETTERS, 10), 'b'=sample(LETTERS, 10), 'e'=sample(LETTERS, 10))
rcombine(list(x, y), c('a', 'b'))