我正在编写一段代码,除了其他变量外,还将标题从bash脚本传递给R.这可能看起来很愚蠢或愚蠢,但对于我的特殊需求,它正是我想要的。所以,我有一个bash脚本:
#!/bin/bash
Rscript script.R "c("column1","column2","column3")"
我已经简化了它,但基本要点是:它启动一个Rscript实例,并将所需的头作为参数传递。 R脚本包含以下部分或相关代码:
args<-commandArgs(TRUE) # enable arguments
header <- args[1] # store the first argument in a variable
现在,我想将数据的标题更改为我作为参数传递的标题。当我从GUI(在我的例子中,Rstudio)运行它时,以下代码片段都可以正常工作:
(1) colnames(data) <- header
(2) colnames(data) <- paste(header, sep=" ")
(3) for (i in 1:length(header)){colnames(data)[i] <- header[i]}
所有这些命令将标题分成3个部分,以便所有三列都获得一个新标题(分别为“column1”,“column2”和“column3”)。但是,如果我从上面描述的bash-script(调用Rscript)运行它,它就不起作用。相反,它给出了这个输出:
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。
有没有人对此有解释/解决方案?任何想法都非常感激。
答案 0 :(得分:3)
问题在于,如果将参数作为字符串传递,则必须将其解析为向量,否则它只是长度为1的向量。为此,您必须使用{{1} }和eval
。
以下是parse
script.R
以下是如何在bash中传递参数:
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)
哪会回来:
Rscript script.R "c('col1','col2','col3')"
答案 1 :(得分:0)
我的猜测是,因为向量是一种R类型,当你通过bash脚本输入它时,Unix不能识别它并将其作为字符串传递给R。因此,R不知道将其视为列名称的向量(或者根本就是向量),因此不知道如何通过for循环将其分解。我们在这里谈论了几个列名?如果真的只有少数我可能只是将它们作为单独的命令行参数输入并将它们组合成一个列表,如果它很多,那么我将它们作为一个带有明确定义的分隔符的长流输入并使用文本处理来将它们分成一个列表,ala:
myvector <- "col1,col2,col3,col4"
mycolnames <- unlist(as.list(strsplit(myvector,",")[[1]]))
如果无法完全复制您的数据和脚本,我无法给您更准确的答案,但希望这会有所帮助。当我需要通过shell脚本将列表传递给R时,我就是这样做的。