为 drake 使用专用环境,使用 r_make()
Use a dedicated environment for drake, with r_make()
我正在尝试调整第 12.7.6.5 of the manual 节中关于使用专用环境(而不是全局环境)的建议,以便与 r_make()
进行交互使用。
我做的是修改_drake.R
配置脚本如下:
envir <- new.env(parent = globalenv())
source("R/packages.R", local = envir) # Load your packages, e.g. library(drake).
source("R/functions.R", local = envir) # Define your custom code as a bunch of functions.
source("R/plan.R", local = envir) # Create your drake plan.
drake_config(plan, envir = envir)
对于任何包、功能和计划。
当我 运行
library(drake)
r_make()
我得到:
Error in if (nrow(plan) < 1L) { : argument is of length zero
Error: <callr_status_error: callr subprocess failed: argument is of length zero>
-->
<callr_remote_error in if (nrow(plan) < 1L) { ...:
argument is of length zero>
in process 1598
See `.Last.error.trace` for a stack trace.
我是不是漏掉了什么?
如果您已经在使用 r_make()
,您很可能不需要为 envir
操心。因为 r_make()
开始和结束在它自己的隔离 callr::r()
进程中,所以主会话的全局环境已经受到保护。事实上,r_make()
在环境再现性方面比envir
好得多,所以你已经在正确的轨道上了。
但如果您仍然想使用envir
,请确保计划是在调用drake_config()
的环境中定义的:即运行[=的会话的全局环境20=]。所以你可以调用 drake_config(envir$plan, envir = envir)
或写 source("plan.R")
而不是 source("plan.R", local = envir)
.
示例:
writeLines(
c(
"library(drake)",
"plan <- drake_plan(x = 1)"
),
"plan.R"
)
writeLines(
c(
"envir <- new.env(parent = globalenv())",
"source(\"plan.R\", local = envir)",
"ls() # does not contain the plan",
"ls(envir) # contains the plan",
"drake_config(envir$plan, envir = envir)"
),
"_drake.R"
)
cat(readLines("plan.R"), sep = "\n")
#> library(drake)
#> plan <- drake_plan(x = 1)
cat(readLines("_drake.R"), sep = "\n")
#> envir <- new.env(parent = globalenv())
#> source("plan.R", local = envir)
#> ls() # does not contain the plan
#> ls(envir) # contains the plan
#> drake_config(envir$plan, envir = envir)
library(drake)
r_make()
#> [32mtarget[39m x
由 reprex package (v0.3.0)
于 2020 年 1 月 13 日创建
writeLines(
c(
"library(drake)",
"plan <- drake_plan(x = 1)"
),
"plan.R"
)
writeLines(
c(
"envir <- new.env(parent = globalenv())",
"source(\"plan.R\") # source into global envir",
"ls()",
"ls(envir)",
"drake_config(plan, envir = envir)"
),
"_drake.R"
)
cat(readLines("plan.R"), sep = "\n")
#> library(drake)
#> plan <- drake_plan(x = 1)
cat(readLines("_drake.R"), sep = "\n")
#> envir <- new.env(parent = globalenv())
#> source("plan.R") # source into global envir
#> ls()
#> ls(envir)
#> drake_config(plan, envir = envir)
library(drake)
r_make()
#> [32mtarget[39m x
由 reprex package (v0.3.0)
于 2020 年 1 月 13 日创建
我正在尝试调整第 12.7.6.5 of the manual 节中关于使用专用环境(而不是全局环境)的建议,以便与 r_make()
进行交互使用。
我做的是修改_drake.R
配置脚本如下:
envir <- new.env(parent = globalenv())
source("R/packages.R", local = envir) # Load your packages, e.g. library(drake).
source("R/functions.R", local = envir) # Define your custom code as a bunch of functions.
source("R/plan.R", local = envir) # Create your drake plan.
drake_config(plan, envir = envir)
对于任何包、功能和计划。 当我 运行
library(drake)
r_make()
我得到:
Error in if (nrow(plan) < 1L) { : argument is of length zero
Error: <callr_status_error: callr subprocess failed: argument is of length zero>
-->
<callr_remote_error in if (nrow(plan) < 1L) { ...:
argument is of length zero>
in process 1598
See `.Last.error.trace` for a stack trace.
我是不是漏掉了什么?
如果您已经在使用 r_make()
,您很可能不需要为 envir
操心。因为 r_make()
开始和结束在它自己的隔离 callr::r()
进程中,所以主会话的全局环境已经受到保护。事实上,r_make()
在环境再现性方面比envir
好得多,所以你已经在正确的轨道上了。
但如果您仍然想使用envir
,请确保计划是在调用drake_config()
的环境中定义的:即运行[=的会话的全局环境20=]。所以你可以调用 drake_config(envir$plan, envir = envir)
或写 source("plan.R")
而不是 source("plan.R", local = envir)
.
示例:
writeLines(
c(
"library(drake)",
"plan <- drake_plan(x = 1)"
),
"plan.R"
)
writeLines(
c(
"envir <- new.env(parent = globalenv())",
"source(\"plan.R\", local = envir)",
"ls() # does not contain the plan",
"ls(envir) # contains the plan",
"drake_config(envir$plan, envir = envir)"
),
"_drake.R"
)
cat(readLines("plan.R"), sep = "\n")
#> library(drake)
#> plan <- drake_plan(x = 1)
cat(readLines("_drake.R"), sep = "\n")
#> envir <- new.env(parent = globalenv())
#> source("plan.R", local = envir)
#> ls() # does not contain the plan
#> ls(envir) # contains the plan
#> drake_config(envir$plan, envir = envir)
library(drake)
r_make()
#> [32mtarget[39m x
由 reprex package (v0.3.0)
于 2020 年 1 月 13 日创建writeLines(
c(
"library(drake)",
"plan <- drake_plan(x = 1)"
),
"plan.R"
)
writeLines(
c(
"envir <- new.env(parent = globalenv())",
"source(\"plan.R\") # source into global envir",
"ls()",
"ls(envir)",
"drake_config(plan, envir = envir)"
),
"_drake.R"
)
cat(readLines("plan.R"), sep = "\n")
#> library(drake)
#> plan <- drake_plan(x = 1)
cat(readLines("_drake.R"), sep = "\n")
#> envir <- new.env(parent = globalenv())
#> source("plan.R") # source into global envir
#> ls()
#> ls(envir)
#> drake_config(plan, envir = envir)
library(drake)
r_make()
#> [32mtarget[39m x
由 reprex package (v0.3.0)
于 2020 年 1 月 13 日创建