这里有两件事:
1)你应该从你的函数中返回你想要的值。否则,将返回最后一个值。在你的情况下,那是names(x). 因此,您应该添加作为最后一行,return(x)或者简单地添加x. 所以,你的函数看起来像:
ChangeNames <- function(x) {
names(x) <- c("A", "B", "C" )
return(x)
}
2)lapply不会通过引用修改您的输入对象。它适用于副本。因此,您必须将结果分配回去。或者另一种选择是使用for-loops而不是lapply:
# option 1
dfs <- lapply(dfs, ChangeNames)
# option 2
for (i in seq_along(dfs)) {
names(dfs[[i]]) <- c("A", "B", "C")
}
即使使用for-loop,您仍然会制作副本(因为names(.) <- .确实如此)。您可以使用tracemem.
df <- data.frame(x=1:5, y=6:10, z=11:15)
tracemem(df)
# [1] "<0x7f98ec24a480>"
names(df) <- c("A", "B", "C")
tracemem(df)
# [1] "<0x7f98e7f9e318>"
如果要通过引用进行修改,可以使用data.table包的setnames功能:
df <- data.frame(x=1:5, y=6:10, z=11:15)
require(data.table)
tracemem(df)
# [1] "<0x7f98ec76d7b0>"
setnames(df, c("A", "B", "C"))
tracemem(df)
# [1] "<0x7f98ec76d7b0>"
您会看到df映射到的内存位置没有改变。名称已通过引用进行了修改。