1

我正在编写一个包装器来按行组合任意数量的数据集。由于有些可能有独特的变量,我首先限制数据中的变量。

我的功能是这样的

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消失了。到底是怎么回事?

4

1 回答 1

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'))
于 2013-04-16T22:47:00.057 回答