首页 > 解决方案 > 如何保存“quosure”以在另一个会话中使用?

问题描述

保存 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)

标签: rnse

解决方案


如果您在函数中创建 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)

推荐阅读