Проблема в том, что когда вы делаете for(x in tab_list)
, то в каждой итерации l oop, x
есть копия каждого элемента в списке. Это , а не псевдоним для элемента в списке. Вот очень простой пример:
my_list <- list(1, 1)
my_list
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 1
for(x in my_list) {x <- 2}
my_list
#> [[1]]
#> [1] 1
#>
#> [[2]]
#> [1] 1
Если бы x
было ссылкой на элемент в списке, то исходный список был бы изменен, но это не так.
Это часто полезно разбить такую проблему на более простые части. В вашем случае вы можете написать функцию, которая хорошо работает с одним фреймом данных:
factor_to_char <- function(x){
are_factors <- sapply(x, is.factor)
x[, are_factors] <- as.character(x[, are_factors])
return(x)
}
Затем вы можете легко применить ее ко всем фреймам данных в вашем списке с помощью lapply
:
lapply(tab_list, factor_to_char)
Или, если вы действительно хотите использовать al oop, вы можете сделать:
for(i in seq_along(tab_list)) {
tab_list[[i]] <- factor_to_char(tab_list[[i]])
}