【发布时间】:2018-04-27 09:04:57
【问题描述】:
在教授 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 与该服务器通信并获取表示的概念感觉过于复杂。
谢谢!
【问题讨论】:
-
...你为什么要这样做?
-
也许让您的学生在 .Rdata 文件中提交他们的答案(使用
save或save.image创建)?然后你可以将他们的答案加载到单独的环境中进行比较? -
@chinsoon12 我确实可以运行每个脚本并将工作区保存在 .RData 文件中,然后将 .RData 文件导入主 R 进程,但我想知道是否有更直接的,更清洁的方式。
标签: r subprocess protocol-buffers environment opencpu