Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA和R:批处理模式与交互模式_R_Vba_Excel - Fatal编程技术网

Excel VBA和R:批处理模式与交互模式

Excel VBA和R:批处理模式与交互模式,r,vba,excel,R,Vba,Excel,我可以使用下面的代码通过ExcelVBA在批处理模式下执行R,但这种方法限制了交互性,因为R在脚本完成后关闭。我希望能够根据Excel用户输入进一步调用R,同时利用在第一次调用中创建的R对象。在仍然使用VBA向R发送消息的情况下,有没有办法保持R处于活动状态 Sub Run_R() Dim shell As Object, Rcmd As String, retval As Variant Set shell = VBA.CreateObject("WScript.Shell") Rcmd

我可以使用下面的代码通过ExcelVBA在批处理模式下执行R,但这种方法限制了交互性,因为R在脚本完成后关闭。我希望能够根据Excel用户输入进一步调用R,同时利用在第一次调用中创建的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

考虑将这两个过程分开。让ExcelVBA通过电子表格或用户表单获取所有需要的用户输入值,然后将它们传递到R脚本中。R将这些值作为命令行参数读取,以便执行更长的操作例程

在这里,R作为应用程序中的子进程生成,类似于接收输入参数并处理输出的单独宏或函数:

VBA

Sub-Run\u R()
Dim shell作为对象,Rcmd作为字符串,retval作为变量
尺寸var1,var2为双精度
var1=范围(“A2”).值
var2=范围(“A5”).值
Set shell=VBA.CreateObject(“WScript.shell”)
Rcmd=“Rscript C:\test.R”&var1&&&var2
retval=shell.Run(Rcmd,0,True)
端接头
R


args没有尝试过它,因为它现在不在Windows计算机上,但是在交互式会话中调用R而不是Rscript可能是可行的?但请注意,Windows将缓冲输出,因此在不强制释放缓冲区或终止R的情况下,可能无法返回一些输出。我们过去曾使用此功能来实现您的目标,但后来改用web服务,以集中方式将R公开给Excel:我尝试在R和Excel之间实现实时连接-请参阅-次级评估员。但是现在连接不是很稳定。谢谢你的想法,汉斯。我试着调用“R”,它从命令窗口中激活了Rterm.exe,实际上它似乎是一个R控制台。现在,如果我可以向活动的Rterm窗口发送更多的R命令,我可能会有一个解决方案。关于如何发送另一个命令有什么想法吗?使用shell.Run()会打开一个新的会话,因此无法工作。我喜欢你所想的Parfait,但你的建议仍然限制了互动性,因为用户在调用R之前必须知道所有输入。我的想法是,用户将对第一个R调用作出反应,通过使用依赖于第一个R调用的输出的输入进行新的通知调用。R的输出是什么?为什么不打几个来回的电话给R?用户第一次运行R,评估输出(csv、img等,无论R生成什么),然后通过第二次调用或更多次调用再次输入。R应该被看作是带有Excel前端的后端代码。事实上,甚至考虑使用R作为GUI前端,使用或在浏览器中运行。无耻的插件,但我最近创建了一个数据库驱动的GUI程序。查看R脚本。当然也包括Excel用户表单!在批处理模式中来回切换到R正是我为了提高效率而试图避免的。每次执行时,操作系统都必须打开R,加载包,运行R,然后关闭R。这对我正在处理的应用程序来说需要花费太多时间,这将需要大量的用户交互。(R的输出是多变量参数估计和图形。)我想在转到Shiny之前,在VBA中用尽我的选项,这需要一些时间来学习。