首页 > 解决方案 > 如何将参数从 Excel/VBA 传递到 Rstudio 中的脚本

问题描述

我正在尝试使用 VBA 中的 Rstudio 打开一个 R 脚本,同时将一个参数传递给 R 脚本,然后我可以使用 commandArgs() 访问它。

该问题与此处描述的问题非常相似:

WScript.Shell 运行一个脚本,在路径中包含空格和来自 VBA 的参数

但是,该解决方案虽然非常好,但似乎对我不起作用。

这是我正在使用的 VBA 代码:

Sub RunRscript()

    ActiveWorkbook.Save

    Dim shell               As Object
        waitTillComplete    As Boolean, _ 
        style               As Integer, _ 
        errorcode           As Integer, _ 
        path                As String, _ 
        var1                As String

    Set shell = VBA.CreateObject("WScript.Shell")
    waitTillComplete = True
    style = 1
    var1 = Range("F3").Value
    path = Chr(34) & "C:\Program Files\RStudio\bin\rstudio.exe" & Chr(34) & " " & 
    Chr(34) & "C:\Users\LI\Downloads\starting_code_v3.R"
    '& Chr(34) & " " & Chr(34) & "var1" & Chr(34)

    errorcode = shell.Run(path, style, waitTillComplete)

End Sub

如您所见,我使用的代码与上面提供的链接中的代码几乎相同,只是添加了一些内容。也就是说,我将 var1 定义为单元格 F3 的内容(在我的情况下,单元格包含文件的路径,但我想它可以是任何东西)。

现在,如果我按照上面介绍的方式运行代码,它就会工作,它会启动 RStudio 并打开脚本。但是,如果我将注释掉下面 1 行的代码添加到变量中(即,如果我尝试在传递参数 var1 的同时启动脚本),RStudio 会打开,但脚本不会,也没有传递任何值上。

任何建议都会有所帮助。

请注意,我在 stackoverflow 和 google 上查看了所有可能的类似主题,并尝试了大量的引号和双引号组合。(我对VBA不是很精通)。

另请注意:

考虑到上述情况,请尽可能提供您的建议。

我希望以上所有内容都有意义,否则请要求澄清。

先感谢您。

标签: rvbarstudio

解决方案


编辑:

问题是 RStudio 而不是你的代码。RStudio 不接受命令行参数:

https://support.rstudio.com/hc/en-us/community/posts/200659066-Accessing-command-line-options-in-RStudio

旧答案:

我看到的问题是您将文本“var1”放入路径而不是名为 var1 的变量的内容。我用堆叠的引号替换了您的 Chr(34),因为我更容易跟踪。如果这对您来说不太可读,我深表歉意。我测试了字符串,它确实将 Var1 的内容作为命令行参数提供。

尝试这个:

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 Long: style = 1
    Dim errorcode As Long
    Dim path As String
    Dim var1 As String
    var1 = ActiveSheet.Range("F3").Value
    path = """C:\Program Files\RStudio\bin\rstudio.exe"" ""C:\Users\LI\Downloads\starting_code_v3.R"" """ & var1 & """"

    errorcode = shell.Run(path, style, waitTillComplete)
End Sub

推荐阅读