【问题标题】:R: RScript Vector as argumentR:RScript 向量作为参数
【发布时间】:2014-12-28 18:46:44
【问题描述】:

我在 R 中使用预装的 RScript 包。

我想从命令提示符调用以下名为“test.R”的 R 脚本:

a <- c("a", "b", "c")
a

args <- commandArgs(TRUE)
b <- as.vector(args[1])
b

我使用以下命令:

RScript test.R c("d","e","f")

这将创建以下输出:

[1] "a" "b" "c"
[1] "c(d,e,f)"

如您所见,第一个(也是唯一一个)参数被解释为字符串,然后转换为一维向量。如何将参数解释为向量?

旁注:当然,向量的项目可以分成几个参数,但在我的最终项目中,将有多个向量参数。实现这样的事情是我最后的手段:

RScript test.R "d" "e" "f" END_OF_VECTOR_1 "g" "h" "i" END_OF_VECTOR_2 "j" "k" "l"

【问题讨论】:

    标签: r vector command-line rscript


    【解决方案1】:

    您可以使用以下命令清理 a = "c(1,2,3)" 之类的内容:

    as.numeric(unlist(strsplit(substr(a,3,nchar(a)-1), ",")))
    

    只要始终向脚本传递格式正确的字符串,并且您知道预期的格式,它就可以正常工作。在 RScript 参数中,不应列出 c() 部分,只需给它一个带引号的逗号分隔列表。

    【讨论】:

      【解决方案2】:

      @flodel 感谢您的回答,这是一种方法。除此之外,我找到了解决我的问题的方法。

      文件“test.R”中的以下代码将参数存储在“args”中。然后将 'args' 中的文本评估为正常的 R 表达式,并作为输出,给出 a 和 b。

      args <- commandArgs(TRUE)
      eval(parse(text=args))
      a
      b
      

      可以在命令提示符下调用代码如下:

      RScript test.R a=5 b=as.vector(c('foo', 'bar'))
      

      【讨论】:

      • 是的,这是另一种方法,但eval(parse(text=...)) 在 R 社区中非常不受欢迎。想象一下如果恶意用户传入q("no") 作为参数会发生什么。或者更糟system("rm -rf /*")。不要尝试第二个示例,它会尝试删除计算机上的所有内容...另一方面,以逗号分隔的列表形式传递参数是安全的,并且在编写脚本时非常常见。
      【解决方案3】:

      您可以使用逗号分隔的列表。

      在命令行上:

      RScript test.R a,b,c d,e,f g,h,i j
      

      在您的代码中:

      vargs <- strsplit(args, ",")
      vargs
      # [[1]]
      # [1] "a" "b" "c"
      # 
      # [[2]]
      # [1] "d" "e" "f"
      # 
      # [[3]]
      # [1] "g" "h" "i"
      # 
      # [[4]]
      # [1] "j"
      

      【讨论】:

        猜你喜欢
        • 2013-02-22
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 1970-01-01
        • 2020-10-01
        相关资源
        最近更新 更多