簡體   English   中英

如何使用callr::r引用session的.GlobalEnv

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM