我可以通过Excel VBA使用下面的代码以批处理模式执行R,但是这种方法限制了交互性,因为R在脚本完成后关闭。我希望能够在使用第一次调用中创建的R对象的同时,基于Excel用户输入进一步调用R。有没有办法在仍然使用VBA向R发送消息时保持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
答案 0 :(得分:2)
考虑分割这两个过程。让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 ...