【问题标题】:Running an R script from command line (to execute from python)从命令行运行 R 脚本(从 python 执行)
【发布时间】:2024-01-07 10:10:01
【问题描述】:

我目前正在尝试从命令行运行 R 脚本(我的最终目标是将它作为 python 脚本的最后一行执行)。我不确定批处理文件是什么,或者如何使我的 R 脚本“可执行”。目前它被保存为 .R 文件。当我从 R 运行它时它可以工作。
如何从 Windows 命令提示行执行此操作?我需要下载一个叫做 Rscript.exe 的东西吗?我只是将我的 R 脚本保存为 .exe 文件吗?请告知实现这一目标的最简单方法。
R: 3.3 版 python: 3.x 版 os: windows

【问题讨论】:

  • 如果在 Windows 资源管理器中单击图标时它可以工作,那么简单的 os.system 就可以工作,或者带有 shell=True 选项集的 subprocess.Popen。当然,使用我刚刚描述的 2 种方法从脚本创建 exe 可以立即工作,但在脚本的某些测试和修改阶段可能会很麻烦。

标签: python r shell command-line


【解决方案1】:

您可能已经拥有 R,因为您已经可以运行您的脚本了。

您所要做的就是找到它的二进制文件(Rscript.exe 文件)。

然后打开windows命令行([cmd] + [R] > 输入:“cmd” > [enter])

输入 R.exe 的完整路径,然后输入脚本的完整路径。

【讨论】:

  • 我有程序 R。我也在使用 jupyter notebook 来运行 python 脚本。能否请您举例说明在 windows 命令提示符中键入什么内容以便我运行 r 脚本?
  • 这取决于 RScript 在哪里。首先你必须在你的系统中找到二进制文件,也许在你的 R 安装文件夹中搜索 Rscript.exe)
  • 也许它已经在 PATH 中,所以尝试在终端中键入:Rscript.exe
  • 我得到输出:当我在 Windows 命令提示符中输入 Rscript.exe 时,'Rscript.exe' 无法识别为内部或外部命令、可运行程序或批处理文件。我认为它不在路径中,但我不确定它在哪里。目前正在寻找它。
  • 谢谢,我找到了 Rscript 的位置,现在可以在命令提示符下使用 -- Rscript.exe full\path\rfile.R
【解决方案2】:

您已经拥有Rscript,它与您的 R 版本一起提供。如果 R.exeRgui.exe、... 在您的路径中,那么 Rscript.exe 也是。

您从 Python 拨打的电话可能只是 Rscript myFile.R。 Rscript 比R BATCH CMD ... 和其他非常陈旧过时的 使用模式要好得多。

【讨论】:

  • 你能详细说明一下吗?为了做到这一点,我需要在 python 中导入任何东西吗?我要使用上面提到的 subprocess.Popen 吗?你能举例说明在 python 中输入什么
  • 您需要调整 PATH 以便笔记本知道 R 二进制文件的位置。 popen()system() 等 pp 都可以调用它 ----- 这几乎 正是 PATH 的用途。如何在 Windows 上调整 PATH 之前已经解释过无数次了。
【解决方案3】:

如前所述,Rscript.exe 是运行 R 脚本的自动化可执行文件,随任何 R 安装(通常位于 bin 文件夹中)一起提供,@Dirk Eddelbuettel mentions 是推荐的自动化版本。在 Python 中,您可以以 subprocess 的形式运行 任何 外部程序,包括 callcheck_outputcheck_call em> 或 Popen,后者提供更多便利,例如捕获子进程中的错误。

如果 R 目录在您的 PATH environmental variable 中,则无需包含 RScript.exe 的完整路径,只需包含程序名称 Rscript。请注意,这与 Linux 或 Mac 操作系统的过程完全相同。

command = 'C:/R-3.3/bin/Rscript.exe'          # OR command = 'Rscript'
path2script = 'C:/Path/To/R/Script.R'
arg = '--vanilla'

# CHECK_CALL VERSION
retval = subprocess.check_call([command, arg, path2script], shell=True)

# CALL VERSION
retval = subprocess.call(["'Rscript' 'C:/Path/To/R/Script.R'"])

# POPEN VERSION (W/ CWD AND OUTPUT/ERROR CAPTURE)
curdir = 'C:/Path/To/R/Script'
p = subprocess.Popen(['Rscript', 'Script.R'], cwd=curdir,
                     stdin = subprocess.PIPE, stdout = subprocess.PIPE, 
                     stderr = subprocess.PIPE)            
output, error = p.communicate()

if p.returncode == 0:            
    print('R OUTPUT:\n {0}'.format(output.decode("utf-8")))
else:                
    print('R ERROR:\n {0}'.format(error.decode("utf-8"))) 

【讨论】:

  • 感谢您的回复。我尝试了“CHECK_CALL VERSION”行,它说我的命令返回了非零退出状态 1。当我在命令提示符下运行 Rscript.exe full\path\rfile.R 时,它运行良好。请注意,我的 R 脚本没有任何返回行,它仅使用 R2PPT/RDCOMClient 包编辑 powerpoint 演示文稿。
  • 仔细检查路径。如评论所述,使用command = 'Rscript'(不需要.exe)而不是完整路径,因为您的命令提示符表明您在PATH 变量中有R。由于没有返回任何输出,因此 Python 控制台上不会出现任何内容。