【发布时间】:2013-07-17 22:05:09
【问题描述】:
我正在尝试编写一个函数,该函数可以一次将另一个函数应用于多个 data.frames。 data.frames 命名为 DATA_1、DATA_2 等,变量“actioncol”用于指示必须更改的列。到目前为止,这是我的代码:
gsubFUN <- function(name, actioncol, ...){
df.vec <- ls(pattern = paste("name", "*", sep="_"), envir=.GlobalEnv)
for(ii in 1:length(df.vec)){
DATA <- get(df.vec[ii])
DATA[,actioncol] <- gsub(pattern.vec[ii], replace.vec[ii], DATA[,actioncol])
assign(paste(name, ii, sep = "_"),DATA, envir = .GlobalEnv)
}
}
我知道我的代码可能很混乱,但它确实有效。由于我希望外部函数也可以在 data.frames 上应用其他函数(不仅仅是 gsub),因此我尝试用变量替换它:
multiDfFUN <- function(name, actioncol, FUN, ...){
df.vec <- ls(pattern = paste(name, "*", sep="_"), envir=.GlobalEnv)
for(ii in 1:length(df.vec)){
DATA <- get(df.vec[ii])
DATA[,actioncol] <- match.fun(FUN)
assign(paste(name, ii, sep = "_"),DATA, envir = .GlobalEnv)
}
}
multiDfFUN(name="audi", actioncol="color", FUN=gsub, pattern=pattern.vec[ii],
replacement=replace.vec[ii], x=DATA[,actioncol])
然而,这会返回一条错误消息:
error in rep(value, length.out = n) :
attempt to replicate an object of type 'closure'
我什至不明白这是什么意思。搜索网络也无济于事。调用函数时的参数模式、替换和 x 可能是导致此问题的原因吗?如果有人能在这个问题上启发我,甚至指出一个简单的解决方案(如果有的话),我会非常高兴。
非常感谢。
【问题讨论】:
-
你怎么能说搜索没有帮助?我刚刚通过搜索错误消息找到了this。
-
我之前也读过那篇文章,没有为我澄清,抱歉。
-
你的印象是
<- match.fun(FUN)在DATA[,actioncol]上调用函数FUN吗? -
是的,我就是这么想的。猜错了吗?
-
大错特错。也许您可以简单地将
gsub(...)替换为FUN(...)。但我会在这里留下我的标准建议,即这个功能非常混乱。从您的词典中删除get和assign;根据需要将参数传递给函数并返回值。不要跨环境获取您需要的对象,然后不要分配到全局环境中。从风格上讲,这很糟糕,而且只会造成比其价值更多的问题。