R - 为什么我的函数似乎可以工作但不能更新列表中的小标题?

R - Why does my function appear to work but not update tibbles within a list?

我有一个 tibbles 列表并使用下面的代码 我希望列表中的每个 tibble 都会有一列添加一个因子(16 个级别之一)。我可以准确地看到我想要打印到控制台的内容,但在全局环境中,我的 tibbles 列表保持不变。我做错了什么?


fn <- function(df){
  df$col1 = cut(df$col1, 16)
  return(df)
  
for (df in listoftibbles){
    df <- fn(df)
    print (df)
  }

for 循环中,它不会更新 listoftibbles 中的元素,即如果我们想这样做,循环遍历对象的序列并通过赋值更新

for(ind in seq_along(listoftibbles)) {
    listoftibbles[[ind]] <- fn(listoftibbles[[ind]])
}

R 中的 for 循环是针对 returns list 元素值的每个循环。 'df' 对象是动态创建的临时对象。这可以通过 ls 检查(假设有 2 个列表元素)

> ls(pattern = '^df$')
character(0) # no object 
> for(df in listoftibbles) print(ls(pattern = '^df$'))
[1] "df"
[1] "df"

> ls(pattern = '^df$')
[1] "df" # now there is an object

对象 'df' 的值将是 listoftibbles

的最后一个 tibble

地址也可以查看

> for(df in listoftibbles) print(tracemem(df))
[1] "<0x7fe59eb4f6c0>"
[1] "<0x7fe598361ac8>"
> tracemem(df) # last object created 
[1] "<0x7fe598361ac8>"

我们可以使用lapply(第一次发帖在这里)

listoftibbles <- lapply(listoftibbles, fn)

或者这个不需要任何功能

listoftibbles <- lapply(listoftibbles, transform, col1 = cut(col1, 16))

map

library(dplyr)
library(purrr)
listoftibbles <- map(listoftibbles, mutate, col1 = cut(col1, 16))

将输出分配回 listoftibbles

for (i in seq_along(listoftibbles)) {
  listoftibbles[[i]] <- fn(listoftibbles[[i]])
  print (listoftibbles[[i]])
}