我正在尝试使用命令行参数从命令行运行R.这包括传入一些文件路径作为在脚本中使用的参数。它大部分时间都有效,但有时路径中有空格而R不理解。
我正在运行以下形式:
R CMD BATCH --slave "--args inputfile='C:/Work/FolderWith SpaceInName/myinputfile.csv' outputfile='C:/Work/myoutputfile.csv'" RScript.r ROut.txt
R抛出一个文件说
Fatal error: cannot open file 'C:\Work\FolderWith': No such file or directory
显然,我的单引号不足以告诉R将引号内的所有内容作为参数值。我在想这意味着我应该找到一种方法来使用逗号分隔我的--args
,但我找不到办法来做到这一点。我确信它很简单,但我在文档中找不到任何内容。
当前脚本非常基本:
ca = commandArgs(trailingOnly=TRUE)
eval(parse(text=ca))
tempdata = read.csv(inputFile)
tempdata$total = apply(tempdata[,4:18], 1, sum)
write.csv(tempdata, outputFile, row.names = FALSE)
如果它是相关的,我正在使用Windows,但看起来它不是cmd提示问题。
答案 0 :(得分:3)
使用eval(parse())
可能不是解析命令行参数的最佳和最有效的方法。我建议使用像optparse
这样的包来为您解析。解析命令行args已经解决,无需重新实现。我可以想象这可以解决你的问题。虽然路径名中的空格开头是个坏主意。
或者,您可以采用一种非常简单的方法并传递这样的参数:
R CMD BATCH --slave arg1 arg2
您可以在哪里检索它们:
ca = commandArgs(TRUE)
arg1 = ca[2]
arg2 = ca[3]
这避免了我认为导致问题的eval(parse
。最后,你可以试着逃离这样的空间:
R CMD BATCH --slave "C:/spam\ bla"
您也可以尝试Rscript
,R CMD BATCH
似乎不如Rscript
。
答案 1 :(得分:1)
作为@PaulHimestra的增强功能,请在此处回答如何使用Rscript:
你创建了一个launcher.bat,
echo off
C:
PATH R_PATH;%path%
cd DEMO_PATH
Rscript youscript.R arg1 arg2
exit
使用R_PATH类似于C:/ Program Files / R / R-version
答案 2 :(得分:1)
这篇文章有很多相似之处: R command line passing a filename to script in arguments (Windows)
此帖也与操作系统有关。我的回答仅适用于Windows。
您所寻找的可能是RScript.exe
而不是R.exe
。后者对空格没有问题:path\to\RScript "My script.r"
。
一件无聊的事情可能是搜索或设置RScript
的路径,并且每次更新R时都这样做。
在我的搜索路径中的便捷脚本中,我写了一个小工具来运行RScript而不用烦人的路径。以防万一可能对某人感兴趣:
@echo off
setlocal
::Get change to file dir par (-CD must be 1st par)
::================================================
Set CHANGEDIR="F"
If /I %1 EQU -cd (
Set CHANGEDIR="T"
SHIFT
)
::No args given
::=============
If [%1] EQU [] GoTo :USAGE
::Get R path from registry
::========================
:: may check http://code.google.com/p/batchfiles for updates on R reg keys
Call :CHECKSET hklm\software\R-core\R InstallPath
Call :CHECKSET hklm\software\wow6432Node\r-core\r InstallPath
if not defined RINSTALLPATH echo "Error: R not found" & goto:EOF
::Detect filepath when arg not starting with "-"
::==============================================
::Note the space after ARGS down here!!!
Set ARGS=
:LOOP
if [%1]==[] (GoTo :ELOOP)
Set ARGS=%ARGS% %1
::Echo [%ARGS%]
Set THIS=%~1
if [%THIS:~0,1%] NEQ [-] (Set FPATH=%~dp1)
SHIFT
GoTo :LOOP
:ELOOP
::echo %FPATH%
::Run Rscript script, changing to its path if asked
::=================================================
If %CHANGEDIR%=="T" (CD %FPATH%)
Echo "%RINSTALLPATH%\bin\Rscript.exe" %ARGS%
"%RINSTALLPATH%\bin\Rscript.exe" %ARGS%
endlocal
:: ==== Subroutines ====
GoTo :EOF
:USAGE
Echo USAGE:
Echo R [-cd] [RScriptOptions] Script [ScriptArgs]
Echo.
Echo -cd changes to script dir. Must be first par.
Echo To get RScript help on options etc.:
Echo R --help
GoTo :EOF
:CHECKSET
if not defined RINSTALLPATH for /f "tokens=2*" %%a in ('reg query %1 /v %2 2^>NUL') do set RINSTALLPATH=%%~b
GoTo :EOF
脚本在运行之前打印实际的RScript调用行。
请注意,添加的参数-cd
可自动更改为脚本目录。实际上,从R内部猜测脚本路径并将其设置为setwd()
)并不容易,以便调用其他脚本或读/写放置在同一路径(或相对路径)中的数据文件。
这个(-cd
)可能会使你的其他命令行变得多余,因为你可能会发现从脚本内部直接调用它们。