Вычеркнуть имя файла с переменной - PullRequest
0 голосов
/ 06 июня 2018

Я использую 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))

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 27 июля 2018

Извините, я так поздно к этой теме.Мне легче находить вопросы по тегу drake-r-package.

Спасибо @Alexis за предоставление ссылки на соответствующую ветку.Подстановочные знаки действительно могут помочь в этом.

Все ваши цели, входные и выходные файлы должны быть явно названы заранее.Это так 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() и выполнить более аккуратную оценку.Обсуждение для системы отслеживания проблем также имеет значение.

...