【问题标题】:VBA code to run R script: output image issue in Excel运行 R 脚本的 VBA 代码:Excel 中的输出图像问题
【发布时间】:2016-11-24 17:23:57
【问题描述】:

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

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

source("Output.R")

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

现在,我使用以下 VBA 代码为宏构建了一个 Excel“界面”来运行脚本:

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)。R

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

load("Mywork.RData")

然后添加一些表格、图表和 cmets。然后,我使用“Model.R”脚本中的以下行生成 Word 文档

render("Report.Rmd")

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

有谁知道这个问题可能是什么原因造成的?

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

【问题讨论】:

  • 您不需要在 VBA 或命令行中转义反斜杠
  • 您一直在引用 imagechartsoutput,但我们没有看到任何代码只运行命令行调用。您可以发布 R 代码以便我们查看您的完整过程吗? R 脚本是否生成 Excel 要呈现的图表图像?
  • 图表是在单独的窗口中绘制的,在excel中不能被shell捕获。尝试从磁盘上的 R 脚本中将图表保存为 png/jpg,并使用 vba 脚本在 Excel 中加载这些图像文件。
  • 感谢大家的帮助。我添加了几行代码,以便您对问题有一个全面的了解。如果您找到解决方案,请告诉我!

标签: r excel vba command-line xlsx


【解决方案1】:

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

【讨论】:

  • 非常感谢您的帮助,代码现在可以正常工作,我可以在 Excel 输出中看到图像!
  • 我现在有另一个小问题,在我的问题的 EDIT 2 部分中进行了描述。如果你有一点时间,如果你能看看它会很棒。抱歉,但正如我所说,我是 VBA 的新手,我仍然想念一些基本概念。谢谢!
  • 解决它: 1)创建环境变量 {RSTUDIO_PANDOC} 指向渲染所需的“pandoc”路径。它在我的机器“G:\Program Files\RStudio\bin\pandoc”中,在你的机器中找到它。 2) 在你的 r 脚本中添加这一行: library(rmarkdown) 。它对我有用。让我知道这是否适合您。
  • 现在可以了!我的脚本中缺少Sys.setenv(RSTUDIO_PANDOC="C:\\Program Files\\RStudio\\bin\\pandoc") 行。再次感谢您的宝贵时间,您的建议非常有帮助!
【解决方案2】:

这对我来说很好。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多