通过在批处理文件中调用源代码使 R 脚本可执行

3
我使用RGtk2编写了一个名为Main.R的GUI,当我在RStudio中运行时,它能够完美地运行,但仅在CMD中打开R并源代码后才能工作。我的目标是使其具有完全的可移植性,因此要编写一个.bat文件来运行它。
传统命令R CMD BATCH Main.RRscript Main.R均无法正常工作。在这些情况下,窗口被创建后立即关闭,而不是等待用户交互。经过一些研究,我发现只有run R script from .bat (batch file)中的OP(遗憾的是未得到答案)遇到了类似的问题,但我的问题与他的不同,因此我仍然认为我的帖子是合理的。
即使对于我使用相同库制作的非常简单的程序,这些命令也无法正常工作,这表明问题可能是由GTk本身引起的。
library(RGtk2)

Destroy <- function(button) {
  window $ destroy()
}

vbox <- gtkVBoxNew (FALSE, 10, TRUE) #container for the first tab
vbox $ setBorderWidth (10)

label <- gtkLabelNew ("Welcome ! Click on the button to close the window")
vbox $ packStart (label, TRUE, 20, 0)

closeButton <- gtkButtonNewWithLabel("Close")
vbox $ packStart(closeButton, FALSE, FALSE, 0)
gSignalConnect (closeButton , "clicked" , Destroy)
#links the startButton to the Start function

window <- gtkWindow (NULL, FALSE)
window ["title"] <- "Example"
gtkWindowResize(window, 800, 450)
window $ add (notebook)

window $ showAll()

在我的批处理文件中,我尝试了以下代码和其他变体:
@echo off
title OCR GUI
start R.exe & "source("OCR_MR/R/Main.R")"

当然,当R会话被手动关闭时,该文件会执行最后一行。由于R.exe无法接受任何参数,我需要让我的批处理文件在R内部进行输入。有什么方法可以做到吗?
非常感谢任何帮助!
更新:感谢一些评论,我意识到Rscript不会等待任何输入。
readline(prompt="message")

无法工作。可能是在非交互模式下运行交互命令的问题,我会随时更新!


readline(prompt = "Hit Enter to quit: ")添加到脚本末尾是否可以解决问题? - Dason
3
请考虑使用Rscript,它已经存在了10多年,并且在各个方面都比R CMD BATCH更好。在Unix上,littler中的r也很不错(虽然我是其(共同)作者,因此不免有偏见)。 - Dirk Eddelbuettel
感谢您的评论!遗憾的是,即使使用@Dason的代码行,我也无法使Rscript正确显示窗口。我开始相信这可能是软件安装问题,因为即使我通过readline命令要求它等待输入,它也不会等待输入。我将继续向您更新情况。 - Maxime Roullet
1个回答

3
找到了答案:我试图通过批处理模式交互地使用R,这显然行不通,因为批处理是非交互式的。
尽管如此,我还是找到了一个解决方法,感谢这个回答:https://dev59.com/FWbWa4cB1Zd3GeqPVVDT#11567220,它包括下载已安装本地项目所有库的R-Portable,并将此函数添加到Rprofile.site文件中(在App/R-Portable/etc中)。
.First = function(){ #.First() is the first function R-Portable will execute when opened
    .libPaths(.Library) #force R-Portable to use the local library
     source("path-to-file") #launches the program
}

那么你只需将包含R-Portable和你的项目的文件夹导出到任何Windows计算机上,然后执行R-Portable.exe,它可以在没有安装R的情况下工作。


谢谢。一直在寻找这个。 - Claudiu Papasteri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接