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