我可以使用下面的代码通过 Excel VBA 以批处理模式执行 R,但此方法限制了交互性,因为 R 在脚本完成后关闭。我希望能够根据 Excel 用户输入进一步调用 R,同时利用第一次调用中创建的 R 对象。有没有办法让 R 保持事件状态,同时仍然使用 VBA 向 R 发送消息?
Sub Run_R()
Dim shell As Object, Rcmd As String, retval As Variant
Set shell = VBA.CreateObject("WScript.Shell")
Rcmd = "Rscript C:\test.R"
retval = shell.Run(Rcmd, 0, True)
End Sub
最佳答案
考虑分割这两个进程。让 Excel VBA 通过电子表格或用户窗体获取所有需要的用户输入值,然后将它们传递到 R 脚本中。 R 读取诸如命令行参数之类的值,以进行更长的操作例程。
在这里,R 作为应用程序中的子进程生成,类似于接收输入参数并处理输出的单独宏或函数:
VBA
Sub Run_R()
Dim shell As Object, Rcmd As String, retval As Variant
Dim var1, var2 As Double
var1 = Range("A2").Value
var2 = Range("A5").Value
Set shell = VBA.CreateObject("WScript.Shell")
Rcmd = "Rscript C:\test.R " & var1 & " " & var2
retval = shell.Run(Rcmd, 0, True)
End Sub
R
args <- commandArgs(trailingOnly=T)
var1 <- args[1]
var2 <- args[2]
# ... run other operations ...
关于r - Excel VBA 和 R : batch mode vs interactive mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39299338/