如何在tidyverse中存储变量名称以进行懒惰求值

问题描述 投票:1回答:1

如果您能帮助我弄清楚整条代码的方式,那就太好了。

假设我有一些数据框:

guys <- tribble(
  ~First,    ~Last, 
  "John",    "Jacob", 
  "Jingle",  "Heimer",
  "Schmidt", "Tara Rara Rara Rara")

cars <- tribble(
  ~Make,    ~Model, 
  "VW",     "Jetta", 
  "Nissan", "Altima", 
  "Ford",   "GT")

the_tables <- c("guys", "cars")

file_pattern <- "./%s.csv"

无编排方式:

for (table_name in the_tables) {
  x    <- get(table_name)
  path <- sprintf(file_pattern, table_name)
  write_csv(x = x, path = path)
}

这很简单也可以。但是我们有很不错的评估工具,其中有一个for

整理方法1:

tables_df <- tibble(
  x    = map(the_tables, get),
  path = sprintf(file_pattern, the_tables))

pwalk(tables_df, write_csv)

虽然它使用pwalk来抽象功能组件。将数据集的副本存储在中间表tables_df中有一个缺点。

即使%>%,也必须将所有这些巨大的数据集(汽车和人)临时存储在临时表中。

我想要的是我认为的承诺,但还不太清楚。

table_df <- tibble(
  x    = promise(the_tables), 
  path = sprintf(file_pattern, the_tables))

我已经尝试过类似x = syms(the_tables)之类的事情来获得这样的承诺,也尝试过x = quos(syms(the_tables));但我仍然缺少一些东西。

谢谢。

然后,当然,我想将其全部整理。

the_tables %>% { tibble(
    x    = promise(.), 
    path = sprintf(file_pattern, .))
  } %>% 
  pwalk(write_csv)

太好了。停顿,只剩下一件。

r tidyverse lazy-evaluation
1个回答
0
投票

您是否也可以共享运行最后一个片段时给您的错误?

© www.soinside.com 2019 - 2024. All rights reserved.