2

我正在使用drake创建多个输出文件,我想通过变量指定路径。就像是

outpath <- "data"
outfile <- file.path(outpath, "mydata.csv")
write.csv(df, outfile)

file_out除了文字字符之外,似乎不适用于给它的参数。

举一个小代码示例:

代码设置

library(drake)

outpath <- "data"
# for reproducibility only
if (!dir.exists(outpath)) dir.create(outpath)

make_data <- function() data.frame(x = 1:10, y = rnorm(10))

工作代码

直接指定文件:

p0 <- drake_plan(
  df = make_data(),
  write.csv(df, file_out("data/mydata0.csv"))
)
make(p0)
#> target file "data/mydata0.csv"

失败代码

用于file.path构造输出文件

p1 <- drake_plan(
  df = make_data(),
  write.csv(df, file_out(file.path(outpath, "mydata1.csv")))
)
make(p1)
#> target file "mydata1.csv"
#> Error: The file does not exist: mydata1.csv
#> In addition: Warning message:
#> File "mydata1.csv" was built or processed,
#> but the file itself does not exist. 

我猜德雷克只找到文字字符串作为目标,而不是结果file.path(...),例如,这也失败了

p2 <- drake_plan(
  df = make_data(),
  outfile = file.path(outpath, "mydata1.csv"),
  write.csv(df, file_out(outfile))
)
#> Error: found an empty file_out() in command: write.csv(df, file_out(outfile))

知道如何解决吗?

4

1 回答 1

4

对不起,我来这个帖子太晚了。我可以更轻松地找到带有drake-r-package标签的问题。

感谢@Alexis 提供相关线程的链接。通配符在这里真的很有帮助。

您的所有目标、输入文件和输出文件都需要提前明确命名。这样就drake可以在不评估计划中的任何代码的情况下找出所有依赖关系。由于drake负责确定何时构建哪些目标,我可能不会在未来的开发中放松这一要求。

对于它的价值,整洁的评估也可能有所帮助。

library(drake) # version 5.3.0
pkgconfig::set_config("drake::strings_in_dots" = "literals")
file <- file.path("dir", "mydata1.csv")
drake_plan(
  df = make_data(),
  output = write.csv(df, file_out(!!file))
)
#> # A tibble: 2 x 2
#>   target         command                                       
#> * <chr>          <chr>                                         
#> 1 df             make_data()                                   
#> 2 output         "write.csv(df, file_out(\"dir/mydata1.csv\"))"

编辑:元编程

我最近在元编程手册中添加了一个冗长的部分。如果您想要更灵活和自动化的方式来生成工作流计划数据帧,您可能不得不放弃该drake_plan()功能并进行更多涉及的整洁评估。关于问题跟踪器的讨论也是相关的。

于 2018-07-27T20:26:58.780 回答