【问题标题】:making commandargs comma delimited or parsing spaces使 commandargs 以逗号分隔或解析空格
【发布时间】:2012-11-23 04:45:55
【问题描述】:

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

【问题讨论】:

    标签: r commandargument


    【解决方案1】:

    使用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受欢迎。

    【讨论】:

    • 使用 Visual Studio 和它创建的默认测试目录中有一个空格。我责怪微软:(我会试试这个,很快就会回复
    • 但我肯定会尝试 optparse 包。或者您可以尝试一种更简单的方法来传递 cmd 行参数,请参阅我的帖子。
    • 您的第三个选项不起作用,因为显然 R 不将“\”理解为空格的转义字符(至少在 --args 内)。第二个选项看起来不应该起作用,因为参数仍然是空格分隔的,所以如果你明白我的意思,当有 3 个参数时它会有 4 个参数?
    • 如果您有带空格的参数,那么您需要将它们括在引号中,例如:Rscript my_script.R arg1 'hello world' arg3 将运行带有三个参数的my_script.R。如果你想研究它,这比 R 更像是一个 unix 的东西。
    • @flodel OP 已经在他的原始问题中使用了引号。这个问题是使用R CMD BATCH还是eval(parse())引起的...
    【解决方案2】:

    作为@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

    【讨论】:

    • 甚至更好的是,您可以将Rscript 的路径放在yourscript.R 的顶部(这称为shebang),使您的脚本可执行,也许甚至删除.R 扩展并将脚本移动到PATH 中的目录。然后你可以从任何地方拨打yourscript arg1 arg2
    • 或者在linux上更花哨#! /usr/bin/env Rscript
    【解决方案3】:

    与这篇文章有很多相似之处: 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) 可能会使您的其他命令参数变得多余,因为您可能会发现直接从脚本内部调用它们很方便。

    【讨论】:

      猜你喜欢
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      相关资源
      最近更新 更多