【问题标题】:Create string from variable name and run through recursive function从变量名创建字符串并通过递归函数运行
【发布时间】:2020-05-15 11:28:01
【问题描述】:

我有一个数据框列表:

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函数识别名字。

谢谢!

【问题讨论】:

  • 试试Create_dir(paste0(i))。
  • @Nico 我认为这只会命名所有目录"paste0(i)"
  • 你可以把filename = deparse(substitute(data))改成filename = eval(substitute(data))
  • 是的,只需将文件夹命名为 paste0(i) (@Nico)
  • @James 您遇到的问题是frame_list 包含未命名 数据框副本,因此一旦您创建frame_list,其中就没有任何名称可以用来创建文件路径。当然,还有很多其他方法可以做到这一点:你可以让 frame_list 成为一个命名列表,或者你可以编写一个函数来获取你想要放入 frame_list 的所有数据帧,但你不能这样做您尝试的方式。

标签: r function


【解决方案1】:

这是一个表示在循环中使用函数时应该使用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 package (v0.3.0) 于 2020-05-15 创建

【讨论】:

  • 嗨,艾伦,我在尝试创建命名列表后更新了我的问题,但我仍在苦苦挣扎。
  • @James 看到我的更新。也许我们把事情弄得太复杂了?
  • 是的,它本身就可以正常工作。问题是我需要它来访问创建文件夹的名称,然后访问数据框本身来执行其他功能,例如 write.csv。所以 Create_dir 需要运行 names[i] 和 [i]
  • 是的,但是@James,您现在可以使用 Filter_list[[i]] 访问数据框 - 这就是重点。查看我的更新
  • 艾伦,非常感谢。这会很棘手,但我认为我可以完成这项工作。抱歉延迟回复。
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2021-03-24
  • 2019-04-02
  • 1970-01-01
相关资源
最近更新 更多