对象在函数中从命名空间中消失

时间:2013-04-16 22:37:38

标签: r

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

我的功能就像这样

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内它会消失。发生了什么事?

1 个答案:

答案 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'))