使命令行以逗号分隔或解析空格

时间:2012-12-05 11:06:54

标签: r commandargument

我正在尝试使用命令行参数从命令行运行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提示问题。

3 个答案:

答案 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"

您也可以尝试RscriptR 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)可能会使你的其他命令行变得多余,因为你可能会发现从脚本内部直接调用它们。