首页 > 解决方案 > R - 为什么我的函数似乎可以工作但不能更新列表中的小标题?

问题描述

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


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

标签: rlistfunctionglobaltibble

解决方案


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

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

for循环 inR是一个 for each 循环,它返回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”的值将是最后tibble一个listoftibbles

并且地址也可以检查

> 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))

推荐阅读