如何保存要在另一个会话中使用的“quosure”?

How to save a `quosure` to be used in another session?

保存 quosure 以便它可以 运行 在另一个会话中的最佳方法是什么?

考虑下面的内容,它使用 {rlang} 的 quosure 概念来引用表达式 x+2 并捕获其全局环境并将其计算为 4.

但是,如果您保存 quosure 然后开始新的会话,那么 eval_tidy 将不再有效,因为 x 在新环境中可能未定义。

我的用例是保存这些表达式并 运行将它们放在单独的会话中。保存 quosure 以便它可以在另一个会话中 运行 的最佳方法是什么?也是拯救环境的唯一方法吗?这并不理想,因为环境中可能包含非常大的物体,因此最好有重量更轻的解决方案。

library(rlang)

x = 2

quo_x_plus_2 = quo(x + 2)


saveRDS(quo_x_plus_2, "plsdel.rds")

# quits R
q()


a = readRDS("plsdel.rds")

rlang::eval_tidy(a)

如果您在一个函数中创建 quosure(以及它所引用的变量),这看起来是可行的:

create_quo <- function() {
  x = 2
  quoted = quo(x + 2)
  quoted
}

quo_x_plus_2 <- create_quo()
# Has an environment attached rather than just
# referring to the global env
quo_get_env(quo_x_plus_2)

# Save, quit and reload as in the original question
saveRDS(quo_x_plus_2, "plsdel.rds")
# quits R
q()
a = readRDS("plsdel.rds")
rlang::eval_tidy(a)