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

VBA code to run R script: output image issue in Excel

我正在使用 R 和 Excel 开发一个项目,使用包 "xlsx" 来打印输出,但我遇到了以下问题。

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

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

如果我 运行 来自 R Studio 的脚本,没问题,输出是正确的。

现在,我构建了一个 Excel "interface" 到 运行 脚本,使用以下 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

感谢您的帮助,我成功解决了问题。我现在要做的是根据相同的脚本自动生成报告(Word 格式,这里没有可用的 LaTex)Model.R

为此,我使用了 Markdown 功能并编写了一个 R Markdown 文件 "Report.Rmd"。在这里,我基本上加载了 Model.R 执行

产生的工作空间
load("Mywork.RData")

然后添加一些表格、图表和评论。然后,我使用 "Model.R" 脚本

中的以下行生成 Word 文档
render("Report.Rmd")

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

有谁知道可能导致此问题的原因吗?

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

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 并从控制台 window 执行它。

批处理文件可能是:

   "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 填充

这对我来说很好。

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