首页 > 解决方案 > 将 R 对象从子进程访问到父进程

问题描述

在教授 R 编程的背景下,我试图完全独立地运行 R 脚本,以便我可以比较它们生成的对象。

目前,我使用 R 环境执行此操作:

student_env <- new.env()
solution_env <- new.env()

eval(parse(text = "x <- 4"), env = student_env)
eval(parse(text = "x <- 5"), env = solution_env)

student_env$x == student_env$y

虽然这提供了一些封装,但到目前为止是完整的。例如,如果我在学生环境中执行library()调用,它会附加到全局 R 会话的搜索路径,从而使包也可用于在解决方案环境中运行的代码。

subprocess为了确保完全分离,我可以使用包启动子流程:

library(subprocess)
rbin <- file.path(R.home("bin"), "R")
student_handle <- spawn_process(rbin, c('--no-save'))
solution_handle <- spawn_process(rbin, c('--no-save'))

process_write(student_handle, "x <- 4\n")
process_write(solution_handle, "x <- 5\n")

但是,我不确定如何执行获取 R 对象的步骤,以便我可以比较它们。

我的问题:

谢谢!

标签: rsubprocessprotocol-buffersenvironmentopencpu

解决方案


另一种可能的方法是callr软件包,它很受欢迎,并且由可靠的来源开发:https ://github.com/r-lib/callr#readme 。

那里的一个例子:

r(function() var(iris[, 1:4]))

#>              Sepal.Length Sepal.Width Petal.Length Petal.Width
#> Sepal.Length    0.6856935  -0.0424340    1.2743154   0.5162707
#> Sepal.Width    -0.0424340   0.1899794   -0.3296564  -0.1216394
#> Petal.Length    1.2743154  -0.3296564    3.1162779   1.2956094
#> Petal.Width     0.5162707  -0.1216394    1.2956094   0.5810063

推荐阅读