这里有两件事:
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
映射到的内存位置没有改变。名称已通过引用进行了修改。