首页 > 解决方案 > 从变量名创建字符串并通过递归函数运行

问题描述

我有一个数据框列表:

frame_list = lst(NotREP, Day0_4, Day10_12, Day14_15, Day20, Day5_7, OIS)

而且我想为每个数据框创建文件夹,每个文件夹都带有数据框的名称(然后根据同一函数中的其他分析将内容放入这些文件夹中,所以我不能只使用 sapply)。我创建了(简化的)函数:

Create_dir = function(data){
  filename = deparse(substitute(data))
  dir.create(filename, showWarnings = FALSE)
}

并使用了 for 循环

for(i in frame_list){
  Create_dir(i)
}

但这会将所有文件夹命名为“i”。有没有办法可以通过该Create_dir函数运行数据框列表并为文件夹提供正确的名称?

或者,我可以在 framelist 中命名数据框:

names(Filter_list) = c("NotREP", "Day0_4", "Day10_12", "Day14_15", "Day20", 
    "Day5_7", "OIS")

但我不知道如何让 for 循环识别名称 [i]。我努力了

for(i in Filter_list) {
  foldername = names(Filter_list)[[i]]
  Create_dir(foldername)
  }

和各种类似的东西,但无法获得for识别名称的功能。

谢谢!

标签: rfunction

解决方案


这是一个表示您应该使用eval而不是deparse在循环中使用函数时的表示:

frame_list <- list("Hello", "World")

Create_dir1 = function(data) print(deparse(substitute(data)))

Create_dir2 <- function(data) print(eval(substitute(data)))

for(i in frame_list) Create_dir1(i)
#> [1] "i"
#> [1] "i"

for(i in frame_list) Create_dir2(i)
#> [1] "Hello"
#> [1] "World"

更新

根据来自 OP 的更多信息,我们根本不需要非标准评估,因为名称可以在dir.create没有Create_dir函数的情况下直接传递给:

names(Filter_list) <- c("NotREP", "Day0_4", "Day10_12", "Day14_15", "Day20", 
    "Day5_7", "OIS")

for(i in names(Filter_list)){
   dir.create(i, showWarnings = FALSE)
   dosomethingwith(Filter_list[[i]])
}

reprex 包于 2020-05-15 创建(v0.3.0)


推荐阅读