这里有两件事:
1) 你应该从你的函数中返回你想要的值。否则,将返回最后一个值。在你的情况下,那是names(x)
。所以,你应该添加最后一行return(x)
或者简单地写成x
。所以,你的函数应该像这样:
ChangeNames <- function(x) {
names(x) <- c("A", "B", "C" )
return(x)
}
2) lapply
不会通过引用修改您的输入对象。它在副本上工作。因此,您将不得不将结果分配回去。或者另一种选择是使用for循环
而不是lapply
:
dfs <- lapply(dfs, ChangeNames)
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)
names(df) <- c("A", "B", "C")
tracemem(df)
如果您想通过引用进行修改,可以使用 data.table
包的 setnames
函数:
df <- data.frame(x=1:5, y=6:10, z=11:15)
require(data.table)
tracemem(df)
setnames(df, c("A", "B", "C"))
tracemem(df)
你会发现内存位置df
映射到的内容没有改变。名称通过引用进行了修改。
names(x) <-
这一行后面添加return(x)
或者简单地写成x
。否则,你只会返回names(x)
。 - Arunlapply
不会修改输入。这里没有发生“引用更改”。所有操作都在副本上完成。您必须将结果重新赋值。执行:dfs <- lapply(dfs, ChangeNames)
。 - ArundfA <- dfs[[1]]
...? - Arun