[英]How to refer to the .GlobalEnv of the session using callr::r
我對callr::r
的理解是,我提供的 function 在 R 的新R
中進行評估。 如果(無論出於何種原因)我想保留這個.GlobalEnv
的 .GlobalEnv,我想我可以這樣做:
i_am_defined_on_global_level <- "here"
res <- callr::r(function() .GlobalEnv)
names(res)
# [1] "res" ".Random.seed"
# [3] "i_am_defined_on_global_level"
但顯然匿名.GlobalEnv
中的 .GlobalEnv 指的是調用環境的全局環境(否則我不會看到i_am_defined_on_global_level
)。
那么我將如何返回.GlobalEnv
的 session 的 .GlobalEnv?
我有一個很大的 Rmarkdown 文檔,由於 Rstudio 中的當前錯誤,我無法run all chunks
,因為我的文檔中沒有非 R 塊。 因此,我必須“手動”運行每個塊,這相當麻煩。
因此,我不想通過knit
按鈕調用render
,而是從命令行調用,在命令行中我可以控制渲染文檔的環境,因此可以保留所有中間結果。 我認為在新的 session 中這樣做以避免名稱沖突是個好主意,因此我想依賴callr::r
:
render_report <- function(report = "myreport.Rmd",
report_dir = here::here("report")) {
report_env <- callr::r(function(report, report_dir) {
rmarkdown::render(file.path(report_dir, report),
output_dir = report_dir,
envir = globalenv())
globalenv()
}, list(report = report,
report_dir = report_dir),
show = TRUE,
spinner = FALSE)
report_env
}
results <- render_report()
但是結果僅指原始的GlobalEnv
。
[編輯以更正第一句話。]問題是.GlobalEnv
以一種奇怪的方式保存。 它只是指當前的全球環境,不管它是什么。 因此,您在 function 中創建的任何內容都將消失,並且res
將指向您當前的全局環境。
要在 callr::r 環境中查看全局變量,我認為您必須將它們復制到新環境並返回。 例如
i_am_defined_on_global_level <- "here"
res <- callr::r(function() {
i_am_in_the_callr_global_env <<- "there"
returnenv <- as.list(globalenv())
list2env(returnenv)
})
names(res)
#> [1] "i_am_in_the_callr_global_env"
創建於 2023-01-12,使用reprex v2.0.2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.