共享驱动器上带有 drake 的文件路径
File paths with drake on a shared drive
我遇到了一些我无法理解的古怪行为。我正在尝试将 .rmd
添加到我的 drake 计划中。我正在远程机器上工作,并且在该机器上的网络驱动器上工作。如果我尝试像这样将 .rmd 文件添加到我的计划中:
> library(drake)
> library(rmarkdown)
>
> list.files()
[1] "drake_testing.Rproj" "foo.png" "report.Rmd"
>
> plan <- drake_plan(
+ png("foo.png"),
+ plot(iris$Sepal.Length ~ iris$Sepal.Width),
+ dev.off(),
+ report = render(
+ input = knitr_in("report.Rmd"),
+ output_file = "report.html",
+ quiet = TRUE
+ )
+
+ )
>
> plan
# A tibble: 4 x 2
target command
<chr> <expr>
1 drake_target_1 png("foo.png")
2 drake_target_2 plot(iris$Sepal.Length ~ iris$Sepal.Width)
3 drake_target_3 dev.off()
4 report render(input = knitr_in("report.Rmd"), output_file = "report.html", quiet = TRUE)
>
> ## Turn your plan into a set of instructions
> config <- drake_config(plan)
Error: The specified file is not readable: report.Rmd
>
> traceback()
13: stop(txt, obj, call. = FALSE)
12: .errorhandler("The specified file is not readable: ", object,
mode = errormode)
11: digest::digest(object = file, algo = config$hash_algorithm, file = TRUE,
serialize = FALSE)
10: rehash_file(file, config)
9: rehash_storage(target = target, file = file, config = config)
8: FUN(X[[i]], ...)
7: lapply(X = X, FUN = FUN, ...)
6: weak_mclapply(X = keys, FUN = FUN, mc.cores = jobs, ...)
5: lightly_parallelize_atomic(X = X, FUN = FUN, jobs = jobs, ...)
4: lightly_parallelize(X = knitr_files, FUN = storage_hash, jobs = config$jobs,
config = config)
3: cdl_get_knitr_hash(config)
2: create_drake_layout(plan = plan, envir = envir, verbose = verbose,
jobs = jobs_preprocess, console_log_file = console_log_file,
trigger = trigger, cache = cache)
1: drake_config(plan)
我尝试了以下排列来完成这项工作:
- 将
.rmd
移动到本地驱动器并使用完整路径调用它
- 在
knitr_in
内外添加file.path
,完成完整路径
- 尝试对上述每种情况使用
file_in
。
我也尝试过调试,但是当 drake 将文件名转换为散列然后将其转换回文件的基本名称(即 report.Rmd
)时,我有点迷茫。调用 digest::digest
时最终会发生错误。
有没有人有尝试弄清楚这样的事情的经验?
我认为答案取决于您在 drake_config(plan)
之外单独调用 digest("report.Rmd", file = TRUE)
时是否会遇到同样的错误。如果它出错(我敢打赌它确实如此),那么您的文件系统可能会与 R 发生冲突。如果是这种情况,那么很遗憾,drake
无能为力。
我还建议对您的计划进行一些更改:
plan <- drake_plan(
plot_step = {
png(file_out("foo.png")),
plot(iris$Sepal.Length ~ iris$Sepal.Width),
dev.off()
},
report = render(
input = knitr_in("report.Rmd"),
output_file = "report.html",
quiet = TRUE
)
)
或者更好的是,将您的工作划分为可重用的函数:
plot_foo = function(filename) {
png(filename),
plot(iris$Sepal.Length ~ iris$Sepal.Width),
dev.off()
}
plan <- drake_plan(
foo = plot_foo(file_out("foo.png")),
report = render(
input = knitr_in("report.Rmd"),
output_file = "report.html",
quiet = TRUE
)
)
目标是一个可跳过的工作流步骤,具有有意义的 return 值 and/or 输出文件。 png()
和 dev.off()
是绘图步骤的一部分,file_out()
告诉 drake
观察 foo.png
的变化。此外,为您的目标命名也是一种很好的做法。通常,目标的 return 值是有意义的,就像 R 中的变量一样。
我遇到了一些我无法理解的古怪行为。我正在尝试将 .rmd
添加到我的 drake 计划中。我正在远程机器上工作,并且在该机器上的网络驱动器上工作。如果我尝试像这样将 .rmd 文件添加到我的计划中:
> library(drake)
> library(rmarkdown)
>
> list.files()
[1] "drake_testing.Rproj" "foo.png" "report.Rmd"
>
> plan <- drake_plan(
+ png("foo.png"),
+ plot(iris$Sepal.Length ~ iris$Sepal.Width),
+ dev.off(),
+ report = render(
+ input = knitr_in("report.Rmd"),
+ output_file = "report.html",
+ quiet = TRUE
+ )
+
+ )
>
> plan
# A tibble: 4 x 2
target command
<chr> <expr>
1 drake_target_1 png("foo.png")
2 drake_target_2 plot(iris$Sepal.Length ~ iris$Sepal.Width)
3 drake_target_3 dev.off()
4 report render(input = knitr_in("report.Rmd"), output_file = "report.html", quiet = TRUE)
>
> ## Turn your plan into a set of instructions
> config <- drake_config(plan)
Error: The specified file is not readable: report.Rmd
>
> traceback()
13: stop(txt, obj, call. = FALSE)
12: .errorhandler("The specified file is not readable: ", object,
mode = errormode)
11: digest::digest(object = file, algo = config$hash_algorithm, file = TRUE,
serialize = FALSE)
10: rehash_file(file, config)
9: rehash_storage(target = target, file = file, config = config)
8: FUN(X[[i]], ...)
7: lapply(X = X, FUN = FUN, ...)
6: weak_mclapply(X = keys, FUN = FUN, mc.cores = jobs, ...)
5: lightly_parallelize_atomic(X = X, FUN = FUN, jobs = jobs, ...)
4: lightly_parallelize(X = knitr_files, FUN = storage_hash, jobs = config$jobs,
config = config)
3: cdl_get_knitr_hash(config)
2: create_drake_layout(plan = plan, envir = envir, verbose = verbose,
jobs = jobs_preprocess, console_log_file = console_log_file,
trigger = trigger, cache = cache)
1: drake_config(plan)
我尝试了以下排列来完成这项工作:
- 将
.rmd
移动到本地驱动器并使用完整路径调用它 - 在
knitr_in
内外添加file.path
,完成完整路径 - 尝试对上述每种情况使用
file_in
。
我也尝试过调试,但是当 drake 将文件名转换为散列然后将其转换回文件的基本名称(即 report.Rmd
)时,我有点迷茫。调用 digest::digest
时最终会发生错误。
有没有人有尝试弄清楚这样的事情的经验?
我认为答案取决于您在 drake_config(plan)
之外单独调用 digest("report.Rmd", file = TRUE)
时是否会遇到同样的错误。如果它出错(我敢打赌它确实如此),那么您的文件系统可能会与 R 发生冲突。如果是这种情况,那么很遗憾,drake
无能为力。
我还建议对您的计划进行一些更改:
plan <- drake_plan(
plot_step = {
png(file_out("foo.png")),
plot(iris$Sepal.Length ~ iris$Sepal.Width),
dev.off()
},
report = render(
input = knitr_in("report.Rmd"),
output_file = "report.html",
quiet = TRUE
)
)
或者更好的是,将您的工作划分为可重用的函数:
plot_foo = function(filename) {
png(filename),
plot(iris$Sepal.Length ~ iris$Sepal.Width),
dev.off()
}
plan <- drake_plan(
foo = plot_foo(file_out("foo.png")),
report = render(
input = knitr_in("report.Rmd"),
output_file = "report.html",
quiet = TRUE
)
)
目标是一个可跳过的工作流步骤,具有有意义的 return 值 and/or 输出文件。 png()
和 dev.off()
是绘图步骤的一部分,file_out()
告诉 drake
观察 foo.png
的变化。此外,为您的目标命名也是一种很好的做法。通常,目标的 return 值是有意义的,就像 R 中的变量一样。