2016-09-01 38 views
3

我正在使用包“xlsx”打包输出并使用R和Excel进行项目,并且遇到以下问题。运行R脚本的VBA代码:在Excel中输出图像问题

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

source("Output.R") 

把它从第一个脚本如果我跑都来自R工作室,没有问题,并且输出正确的脚本。

现在,我建立了一个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已正确创建,但该图像是空白框。

EDIT 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。

+3

你不需要 –

+0

你保持引用*图片*,*图表*和*输出*,但我们没有看到代码运行的东西只是一个命令行调用逃脱反斜线VBA或在命令行上。你可以发布R代码,以便我们看到你的完整过程? R脚本是否生成Excel要呈现的图表图像? – Parfait

+0

图表是在单独的窗口中绘制的,在excel中不能被shell捕获。尝试从磁盘上的R脚本中将图表保存为png/jpg,并使用vba脚本在Excel中加载这些图像文件。 –

回答

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") 

为了确保代码工作与预期结果,创建一个批处理文件e.g do.bat,并从控制台窗口中执行它。

该批处理文件可能是:

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

应该工作,Excel是充满图像。

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

我使用下面的VBA脚本在Excel中调用do.bat:

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

我已经测试的代码和它的工作和填写图像

+0

非常感谢您的帮助,代码现在正常工作,我可以在Excel输出中看到图像! – Jise7

+0

我现在有另一个小问题,在我的问题的编辑2部分中描述。如果你有一点时间的话,如果你能看一看就会很棒。对不起,但正如我所说我是新的VBA,我仍然想念一些基本概念。谢谢! – Jise7

+0

要解决它:1)创建指向渲染所需的“pandoc”路径的环境变量{RSTUDIO_PANDOC}。它在我的机器“G:\ Program Files \ RStudio \ bin \ pandoc”中找到它。 2)在你的r脚本中添加这行:library(rmarkdown)。它为我工作。让我知道这是否适合你。 –

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