我有一个非常基本的问题。
我是R的新用户,这些天我使用一个R包进行分析,我必须运行该包的R命令列表以获得所需的输出。 我想创建我的分析管道并自动化它,以便我可以使用一个带有所需参数的单个R命令来完成我的工作。
我们在shell脚本中做的这类工作(我们添加了多个linux命令,awk / sed / perl行
请给我一些关于如何做到这一点的链接,我会很感激。
答案 0 :(得分:14)
假设这是我的分析管道:我想从正态分布生成10个数字,平均值为MU
,标准差为SD
,然后用它们做其他事情:
MU <- 1 # the mean
SD <- .5 # standard deviation
NUMBER_TO_GENERATE <- 10
x <- rnorm(NUMBER_TO_GENERATE, mean=MU, sd=SD)
# ... more analysis here.
目前我将这些命令复制粘贴到R终端。 有几种方法可以“自动化”。
我将我的命令列表包含在一个大函数中,并将我的参数作为函数参数:
myFunction <- function( MU, SD, NUMBER_TO_GENERATE ) {
x <- rnorm(NUMBER_TO_GENERATE, mean=MU, sd=SD)
# ... rest of analysis
}
现在在R中,我可以myFunction(1, .5, 10)
,减少我必须输入的命令数量。
我可以写一个脚本文件myScript.r
。这就像一个bash脚本,除了它是一个R命令列表。
我可以 将我原来的命令列表放在那里,或者我可以将我的函数放在那里以及底部myFunction(1,.5,10)
的附加声明。
然后从在 R中,我可以这样做:
source('myScript.r')
它将运行脚本中的所有R命令。
如果你想从shell中获取这个脚本,我建议你有一个文件myScript.r
,里面有这个函数。
然后查看Rscript(您可以从R中?Rscript
)。这是默认安装的R,您可以使用它从unix / windows命令行执行R命令。
例如:
[mathematical.coffee@bar ~]$ Rscript -e '1+1'
[1] 2
特别是,您可以将方法1)和2)与Rscript
结合使用,以执行以下操作:
[mathematical.coffee@bar ~]$ Rscript -e 'source("myScript.R"); myFunction( 1, .5, 10 )'
运行你的功能。
或者您当然可以在myFunction(1, .5, 10)
中加入myScript.R
,在这种情况下,您可以Rscript myScript.R
。
前者的优点是如果你想做shell脚本(我只提到这个,因为你在你的问题中提到了bash脚本)。在 bash 脚本中,我们可以执行以下操作:
#!/bin/bash
MU=1;
SD=.5;
NUM=10;
Rscript -e "source('myScript.r'); myFunction($MU,$SD,$NUM)"
但是我认为没有将bash脚本与R脚本混合 - 正如我之前提到的,我只提到了这个选项,因为你在你的问题中提到了bash / unix脚本。
答案 1 :(得分:2)
功能可能就是你要找的东西
foo <- function() {
data <- data.frame(a=1:10, b=10:1)
plot(data)
# many more commands here
}
然后你可以调用foo()
并运行所有命令。
有关更深入的信息,请参阅R help。
您也可能感兴趣source()
,请参阅?source
。
答案 2 :(得分:0)
另一种选择是使用Rscript运行程序。可以使用函数args <- commandArgs(trailingOnly=TRUE)
访问命令行中的参数(它们作为列表返回)
e.g。使用上面的math.coffee示例,您的脚本看起来像
输入'contributors()'以获取更多信息和 '引用()'关于如何在出版物中引用R或R包。
args <- commandArgs(trailingOnly=TRUE)
MU <- as.numeric(args[[1]]) # the mean
SD <- as.numeric(args[[2]]) # standard deviation
NUMBER_TO_GENERATE <- as.integer(args[[3]])
rnorm(NUMBER_TO_GENERATE, mean=MU, sd=SD)
doOtherStuff(x)
然后,您可以将您的功能称为Rscript myscript.R 2.0 0.1 100
如果你想用参数做更好的事情(例如--filename),你可以使用optparse库。 http://www.r-bloggers.com/passing-arguments-to-an-r-script-from-command-lines/