r - 将 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 对象的步骤,以便我可以比较它们。
我的问题:
- 是
subprocess
一个好方法吗? - 如果是,我如何(有效地!)从子进程中获取对象的 R 表示,以便比较父进程中的对象?Python 通过酸洗/挖掘来做到这一点。
- 我可以通过 .rds 文件进行通信,但这是不必要的文件创建/读取。
- 在 R 中,我遇到了
RProtoBuf
,但我不确定它是否能解决我的问题。
- 如果没有,我应该考虑其他方法吗?我已经研究过
opencpu
,但是启动本地服务器然后使用 R 与该服务器对话并获取表示的概念感觉太复杂了。
谢谢!
解决方案
另一种可能的方法是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
推荐阅读
- c# - 网络安全创建用户和帐户。提供者遇到未知错误
- java - 打印没有元素相邻的所有子序列数组
- java - E/AndroidRuntime: 致命例外: main -Android 5.1
- arrays - 快速从数组对象中获取特定值
- javascript - 如何在 React Hooks 中的 Object 内部的方法中访问 Object 属性
- phaser-framework - 如何在 Phaser ES6 中导入 Razorpay 插件
- c++ - 如何在另一个函数中使用我在函数中编写的内容?
- c - 在实现 _BV() 宏时减少代码重复
- apache-spark - 仅对 group by 中的不同值求和
- python - 溢出错误:使用 cv2.line() 时 Python int 太大而无法转换为 C long