假设我有以下 R 代码:
我的问题是:为什么在函数内部底部对r1的赋值失败,出现了“Error in get(columnName1) : object 'columnName1' not found”错误提示?
在函数上方对r的赋值正常。同样地,如果我在函数内部通过<<-进行全局赋值columnName1,那么我就创建了一个我不真正需要的全局变量。我该如何重新编写代码,使得data.table能够在其范围内找到columnName1?我对作用域的理解是否有误?我本以为如果在“[”函数中找不到columnName1,它会向上查找一个环境并在那里找到它?但它必须在全局环境中查找,而不是在父环境中查找?
library(data.table)
L <- list(a=data.table(x=c(1,2,3),y=c(10,20,30)),
b=data.table(x=c(4,5,6),y=c(40,50,60)),
c=data.table(x=c(7,8,9),y=c(70,80,90)))
columnName <- "x"
r <- lapply(L,"[",i=get(columnName) %in% c(1,4))
f <- function(L1) {
columnName1 <- "x"
r1 <- lapply(L1,"[",i=get(columnName1) %in% c(1,4))
return(r1)
}
r1 <- f(L)
我的问题是:为什么在函数内部底部对r1的赋值失败,出现了“Error in get(columnName1) : object 'columnName1' not found”错误提示?
在函数上方对r的赋值正常。同样地,如果我在函数内部通过<<-进行全局赋值columnName1,那么我就创建了一个我不真正需要的全局变量。我该如何重新编写代码,使得data.table能够在其范围内找到columnName1?我对作用域的理解是否有误?我本以为如果在“[”函数中找不到columnName1,它会向上查找一个环境并在那里找到它?但它必须在全局环境中查找,而不是在父环境中查找?
lapply
的环境有关。如果您的原始函数f
使用全局环境中存在的columnName
而不是columnName1
,它就可以工作了。 - manotheshark