关于r:在Rscript中将标头作为参数传递(与在GUI中运行代码不同的结果)

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的向量。为此,您必须使用evalparse

这里是一个示例script.R

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时的方法。