运行R脚本的VBA代码:在Excel中输出图像问题

时间:2016-09-01 15:57:41

标签: r excel vba command-line xlsx

我正在使用R&Excel的项目,使用包" xlsx"打印输出,我有以下问题。

分析由名为" Model.R"的脚本执行。第二个脚本,名为" Output.R"生成我的分析的输出(包括一些图表)。我用命令

从第一个脚本调用它
source("Output.R")

如果我从R Studio运行这两个脚本,没问题,输出正确。

现在,我建立了一个Excel"界面"运行脚本,使用宏的以下VBA代码:

Sub Run_script()
    Dim cmdLine As String
    cmdLine="C:\\Program Files\\R\\R-3.3.1\\bin\\Rscript C:\\...\\Model.R"
    shell cmdLine
End Sub

现在一切正常,输出正确地打印在一个新的Excel文件中,这是因为现在所有的图表都是空白的,没有任何内容。

有没有人知道如何解决这个问题?例如,可能是从Excel运行脚本的另一种方法。

谢谢

修改

以下是生成并保存其中一个图表的R代码,例如:

hist(P1,probability=FALSE,main = "",breaks = 20)
title("CE Anno -1")
dev.copy(png,filename="CE1.png");
dev.off ()

因此图像将保存为同一工作目录中的png文件。然后,要在Excel中打印它,我使用 xlsx 包和以下代码:

outwb <- createWorkbook()
SummaryCE <- createSheet(outwb, sheetName = "Summary CE")
addPicture("CE1.png", SummaryCE, scale = 0.5, startRow = 11, startColumn = 1)
saveWorkbook(outwb, "Risultati RO.xlsx")

正如我所说,如果我从R Studio运行它,这段代码工作正常。使用以前的VBA代码从命令行调用它,Excel正确创建,但图像是一个空白框。

编辑2

感谢您的帮助,我成功地解决了这个问题。我现在要做的是基于相同的脚本Model.R自动生成报告(Word格式,此处没有LaTex)

为此,我使用Markdown功能并编写一个R Markdown文件&#34; Report.Rmd&#34;。在这里,我基本上加载了Model.R执行所产生的工作空间

load("Mywork.RData")

然后添加一些表格,图表和评论。然后,我使用&#34; Model.R&#34;中的以下行生成Word文档。脚本

render("Report.Rmd")

同样,我有一个类似的问题。如果我从R Studio运行它,一切都很好。如果我使用以前的Excel界面,Word输出不会出现在文件夹中。

有谁知道可能导致这个问题的原因?

谢谢你,对于几个问题感到抱歉,我很满意R,但这是我第一次使用VBA。

2 个答案:

答案 0 :(得分:2)

dev.copy在非交互模式下(shell命令)运行不正常。修改代码,如以下脚本中所示:

    require(xlsx)

    fname <- "CE1.png"

    #add this device. you can use other device,e.g. jpg /bmp/tiff devices
    png(fname)  # you can define width /height as needed

    hist(P1,probability=FALSE,main = "",breaks = 20)
    title("CE Anno -1")

    #dev.copy(png,filename="CE1.png");  #remove this line

    dev.off ()

     # the following code used  as is 
    outwb <- createWorkbook()
    SummaryCE <- createSheet(outwb, sheetName = "Summary CE")
    addPicture("CE1.png", SummaryCE, scale = 0.5, startRow = 11, startColumn = 1)
    saveWorkbook(outwb, "Risultati RO.xlsx")

要确保代码正在使用预期结果,请创建一个批处理文件,例如do.bat并从控制台窗口执行它。

批处理文件可能是:

   "I:\Program Files\R\R-3.2.1\bin\i386\rscript" --verbose    model.r

它应该正常工作,excel充满了图像。

如果成功完成,您可以在Excel中调用批处理文件

我在excel中使用以下VBA脚本来调用do.bat:

 Sub RunShell()
 Dim currentPath As String
 currentPath = ActiveWorkbook.Path
'Debug.Print currentPath 
 Call Shell(currentPath & "\do.bat ", vbNormalFocus)
 End Sub

我已经测试了代码并且它正在运行并且使用图像填充excel

答案 1 :(得分:0)

这对我来说很好。

Sub RunRscript1()
    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
    Dim path As String

    ' http://shashiasrblog.blogspot.com/2013/10/vba-front-end-for-r.html
    path = "C:\Users\your_path\Documents\R\R-3.2.5\bin\x64\R.exe CMD BATCH --vanilla --slave C:\Users\your_path\Documents\R\Download.r"
    'path = """C:\Users\your_path\Documents\R\R-3.2.5\bin\i386"" C:\Users\your_path\Documents\R\Download.R"
    errorCode = shell.Run(path, style, waitTillComplete)
End Sub