7

コマンドライン引数を使用してコマンドラインから 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プロンプトの問題ではないようです。

4

3 に答える 3

3

を使用するeval(parse())ことは、おそらくコマンド ライン引数を解析するための最良かつ最も効率的な方法ではありません。のようなパッケージを使用optparseして解析を行うことをお勧めします。コマンド ライン引数の解析は既に解決されているため、再実装する必要はありません。これで問題が解決すると想像できます。ただし、そもそもパス名にスペースを入れるのはよくありません。

または、非常に単純なアプローチを取り、次のように引数を渡すこともできます。

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

于 2012-12-05T11:14:53.283 に答える
1

この投稿には多くの類似点があり ます。引数でスクリプトにファイル名を渡すRコマンドライン(Windows)

また、この投稿は非常にOSに関連しています。私の答えはWindowsにのみ当てはまります。

おそらくあなたが探しているのはRScript.exeの代わりですR.exe。後者はスペースに問題はありません:path\to\RScript "My script.r"

退屈なことの1つは、RScriptRを更新するたびにパスを検索または設定し、これを実行することです。

検索パスにある便利なスクリプトの中で、パスを気にせずに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スクリプトディレクトリに自動的に変更するための引数、が追加されていることに注意してください。実際setwd()、同じパス(または相対パス)に配置された他のスクリプトを呼び出したり、データファイルを読み書きしたりするために、Rの内側からスクリプトパスを推測する(そしてそれをで設定する)のは簡単ではありません。

これ(-cd)は、スクリプト内から直接呼び出すと便利な場合があるため、他のcommandargを不要にする可能性があります。

于 2012-12-05T14:22:48.713 に答える
1

@PaulHimestra answer here の拡張として、 Rscript の使用方法:

launcher.bat を作成し、

echo off
C:
PATH R_PATH;%path%
cd DEMO_PATH
Rscript youscript.R arg1 arg2
exit

C:/Program Files/R/R-version のような R_PATH を使用

于 2012-12-05T11:35:44.703 に答える