我正在使用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。
答案 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