r - 从 VBA 启动 R 脚本时保持 Shell / cmd 打开
问题描述
我有一个 R 脚本,它通过链接到 VBA 脚本的按钮从 Excel 工作簿运行。
问题是每次 R 脚本遇到错误时 - 比如说它没有找到它应该读取的文件之一 - R 脚本正在运行的 Shell / cmd 窗口会立即关闭。问题是你看不到任何关于它为什么失败的线索。然后我必须通过修改代码并在 RStudio 中运行以查找错误来手动调试它——通常我必须为其他不了解 R 的人这样做。
我使用的 VBA 代码是从我在此处找到的 SO 帖子之一复制和修改的。我对 VBA 不是很精通,也不懂很多代码,所以我正在寻找一个简单的解决方案。我的 VBA 代码是这样的:
Option Explicit
Public Sub RunRscript()
ActiveWorkbook.Save
Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim scriptPath As String
scriptPath = Range("F5").Value
Dim argument As String
argument = Range("F3").Value
Dim path As String
path = """C:\Program Files\R\R-3.4.2\bin\Rscript.exe"" """ & scriptPath & """ """
& argument & """"
ActiveWorkbook.Save
Dim errorcode As Integer
errorcode = shell.Run(path, style, waitTillComplete)
ActiveWorkbook.Save
End Sub
scriptPath
指向 R 脚本的路径,argument
是我传递给 R 脚本的参数。
我尝试传递通常的参数来保持 cmd 窗口打开,但我没能弄清楚。这也很复杂,因为如前所述,我不太了解 VBA 语法,并且由于那些无休止的双引号,“路径”变量非常复杂。
解决方案
你可能会使用
errorcode = shell.Run("cmd /k " & path, style, waitTillComplete)
代替
errorcode = shell.Run(path, style, waitTillComplete)
我们打开一个命令行工具的新实例,从而可以使用它的参数。参数 /k k保持 cmd 窗口打开(使用 /c 使c丢失)。在 cmd 参数之后,我们添加要执行的脚本。
但是有一个问题:如果关闭 cmd 窗口,VBA 会引发溢出错误。我在我的 Excel 工作表中使用一个标志在调试模式和正常模式之间切换:
debugging = Range("N5").Value 'True/False
If debugging Then
errorCode = shell.Run("cmd /k " & path, style, waitTillComplete)
Else
errorCode = shell.Run(path, style, waitTillComplete)
End If
如果脚本失败,我会在 Excel 工作表的单元格中重新运行它,将调试模式设置为 True。
推荐阅读
- sas - SAS 中的 SQL Convert 函数操作
- java - 如何在我编写的代码中实现通道 1?注意:我想在特定时间显示通知
- angular - 如何使用 i18n 以角度转换自定义管道?
- c# - 无法将 ListView ItemsSource 设置为自定义对象列表
- python-3.x - 当存储桶名称有 / 分隔符时,如何使用 boto3 包将文件上传到 Amazon S3
- javascript - Amcharts V4 如何在不重新加载整个图表的情况下更改数据?
- android-studio - 在 Android Studio 中计算 CMake 服务器结果时出错
- r - 使用二进制图像在 R 中发布请求
- python - 如何使用 psycopg2.sql 将列列表或 *(所有列)传递给动态 SQL 查询
- python - 如何在 python 中进行这种集成:when y(t)=integrate[f(t,y)]