【问题标题】:Pass a list of characters as parameter to RScript in VBA?将字符列表作为参数传递给VBA中的RScript?
【发布时间】:2019-12-06 14:17:36
【问题描述】:

我有一个运行良好的 R 脚本,其中一个变量被设置为:

Benchmark <- c("Bench1","Bench2","Bench3","Bench4","Bench5","Bench6")

Benchmark
[1] "Bench1"   "Bench2"   "Bench3"   "Bench4"   "Bench5"   "Bench6"  

稍后在代码中,如果其中一列在 Benchmark 中存在值,我会检查表:

CollStruc <- CollStruc[CollStruc$Designer %in% Benchmark,]

直到那里,没问题。这里的问题是我想从 VBA 调用 Rscript,这要归功于这段代码:

Dim shell As Object
Set shell = VBA.CreateObject("WScript.Shell")
Dim waitTillComplete As Boolean: waitTillComplete = True
Dim style As Integer: style = 1
Dim errorCode As Integer

'Paramètres à passer à R
Dim CheminR As String, Benchmark As String

NbBench = WSExec.Range("C16").End(xlDown).Row - WSExec.Range("C16").Row

Benchmark = """" & WSExec.Range("C16").Value & """"
For i = 1 To NbBench
    Benchmark = Benchmark & "," & """" & WSExec.Range("C16").Offset(i, 0).Value & """"
Next i

Dim path As String
path = "RScript \\Tagwalk-nas\public\R-Scripts\Brand_Equity-Benchmark-parameters.R " & Benchmark

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

我一直在 RScript 中传递参数,如下所示:

args <- commandArgs(trailingOnly=T)
Benchmark <- c(args[1])

这就是问题所在。我的 Benchmark 变量看起来不像我期望的那样,因此其余代码返回错误

基准 "1" "Bench1,Bench2,Bench3,Bench4,Bench5,Bench6"

你知道我怎样才能完成这项工作吗? 谢谢

编辑: 感谢亚当和冻糕的帮助。

在 VBA 中创建的变量 Benchmark 现在看起来像这样:

print.debug(Benchmark)
"Bench1,Bench2,Bench3,Bench4,Bench5,Bench6"

我已尝试按照 Adam 的建议使用 unlist,它似乎可以根据需要转换变量。 这是我在 R 中使用它时的变量:

str(Benchmark)
chr [1:6] "gucci" "louis-vuitton" "chanel" "christian-dior" "prada" "fendi"

这是sink() 提供的输出,我将str(Benchmark) 放入从VBA 执行的Rscript 中:

 chr [1:6] "gucci" "louis-vuitton" "chanel" "christian-dior" "prada" ...

【问题讨论】:

    标签: r vba shell parameters


    【解决方案1】:

    您正在传递一个逗号分隔的列表。我无法复制您的项目,所以这将是部分答案。

    一旦你有了Benchmark &lt;- "Bench1,Bench2,Bench3,Bench4,Bench5,Bench6",问题就变得很简单了。在您尝试运行脚本后,我无法从您的问题中看出 Benchmark 的结构是什么。所以你可能需要在准备好之前清理它或unlist()它。

    那么,

    args <- commandArgs(trailingOnly=TRUE)
    
    Benchmark <- unlist(strsplit(args[1],","))
    #[1] "Bench1" "Bench2" "Bench3" "Bench4" "Bench5" "Bench6"
    

    【讨论】:

    • 你能做一个str(Benchmark) 或者别的什么,这样我们就可以看到你的变量中有什么?否则,我没有你的excel表。在让您的 VBA 运行之前,我必须尝试创建一个可以与您的代码一起使用的代码。而且很可能只是你不了解不同类型的r变量。
    • 我不是 OP。我建议您显示 commandArgs 以帮助 OP 将他/她与您的连接。
    • 啊。明白了。星期五在这里失去动力。
    猜你喜欢
    • 1970-01-01
    • 2022-07-27
    • 2023-03-05
    • 2014-08-13
    • 1970-01-01
    • 2018-06-03
    • 2021-06-01
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多