Passing header as argument in Rscript (different result from running code in GUI)
我正在编写一段代码,其中包括将变量从bash脚本的标头传递到R的代码。这看似愚蠢或愚蠢,但是对于我的特殊需求,这正是我想要的。因此,我有一个bash脚本:
1 2 | #!/bin/bash Rscript script.R"c("column1","column2","column3")" |
我已经简化了它,但是要点已经存在:它启动Rscript的实例,并以所需的标头作为参数传递。 R脚本包含以下片段或相关代码:
1 2 | args<-commandArgs(TRUE) # enable arguments header <- args[1] # store the first argument in a variable |
现在,我想将数据的标题更改为作为参数传递的标题。当我从GUI(在我的情况下为Rstudio)运行它时,以下代码段都能按需工作:
1 2 3 | (1) colnames(data) <- header (2) colnames(data) <- paste(header, sep="") (3) for (i in 1:length(header)){colnames(data)[i] <- header[i]} |
所有这些命令将标题分成三段,以便所有三列都获得一个新的标题(分别为" column1"," column2"和" column3")。但是,如果我如上所述从我的bash脚本运行此程序(称为Rscript),它将无法正常工作。相反,它给出以下输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | c(column1,column2,column3) Chromosome 1 rs10 7 2 rs1000000 12 3 rs10000010 4 4 rs10000012 4 5 rs10000013 4 6 rs10000017 4 Position 1 92221824 2 125456933 3 21227772 4 1347325 5 36901464 6 84997149 |
...很明显,这不是我想要的。上面列出的三个命令现在都无法按预期运行。这使我感到困惑,因为无论我使用哪种方式(无论是Rstudio还是Rscript),我都希望代码的结果是相同的。
有人对此有解释/解决方案吗?任何想法都非常感谢。
问题是,如果您将参数作为字符串传递,则必须将其解析为向量,否则它将只是长度为1的向量。为此,您必须使用
这里是一个示例
1 2 3 4 5 6 | args<-commandArgs(TRUE) header<-eval(parse(text=args[1])) data<-data.frame(one=1:10,two=1:10,three=1:10) colnames(data)<-header head(data) |
这是在bash中传递参数的方式:
1 | Rscript script.R"c('col1','col2','col3')" |
哪个会返回:
1 2 3 4 5 6 7 | # col1 col2 col3 # 1 1 1 1 # 2 2 2 2 # 3 3 3 3 # 4 4 4 4 # 5 5 5 5 # 6 6 6 6 |
我的猜测是,由于向量是R类型,因此当您通过bash脚本输入向量时,Unix无法识别它,而是将其作为字符串传递给R。因此,R不知道将其视为列名的向量(或者就此而言,根本不是向量),因此也不知道如何通过for循环将其分解。我们在这里谈论几个列名?如果真的只有几个,我可能只是将它们作为单独的命令行参数输入,然后将它们合并到一个列表中;如果很多,那么我将把它们作为长流输入,并带有一个井定义的分隔符,并使用文本处理将其拆分为一个列表,ala:
1 2 | myvector <-"col1,col2,col3,col4" mycolnames <- unlist(as.list(strsplit(myvector,",")[[1]])) |
无法精确地复制您的数据和脚本,我无法为您提供更准确的答案,但希望能对您有所帮助。这是我需要通过shell脚本将列表传递给R时的方法。