我有一个非常基本的问题。
我是R的新用户,这些天我使用一个R包进行分析,我必须运行该包的R命令列表才能获得所需的输出。我想让我的分析流水线自动化,这样我就可以使用一个带有所需参数的R命令来完成我的工作。
这类工作是在shell脚本中完成的(在shell脚本中,我们添加了许多linux命令、awk/sed/perl行
请为我提供一些如何做到这一点的链接,我将不胜感激。
发布于 2012-04-26 14:31:12
假设这是我的分析流程:我想用均值MU和标准差SD从正态分布中生成10个数字,然后用它们做其他事情:
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终端。有几种方法可以“自动化”这个过程。
1.编写函数
我将我要执行的命令列表包含在一个大函数中,并将我的参数作为函数参数:
myFunction <- function( MU, SD, NUMBER_TO_GENERATE ) {
x <- rnorm(NUMBER_TO_GENERATE, mean=MU, sd=SD)
# ... rest of analysis
}现在在R中,我可以只执行myFunction(1, .5, 10),将我必须键入的命令数量减少到1。
2.编写脚本
我可以写一个脚本文件myScript.r。这类似于bash脚本,只是它是一个R命令列表。
我可以把我的原始命令列表放在那里,或者我可以把我的函数放在那里,并在底部的myFunction(1,.5,10)中加上一个额外的语句。
然后在R中,我可以这样做:
source('myScript.r')它将运行脚本中的所有R命令。
3.从shell中
如果您想从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脚本。
发布于 2012-04-26 14:15:36
函数可能就是您要查找的函数
foo <- function() {
data <- data.frame(a=1:10, b=10:1)
plot(data)
# many more commands here
}然后,您只需调用foo(),所有命令都会运行。
有关更深入的信息,请参阅R help。
此外,您可能会对source()感兴趣,请参阅?source。
发布于 2016-04-01 15:14:42
另一种选择是使用Rscript运行您的程序。命令行中的参数可以通过函数args <- commandArgs(trailingOnly=TRUE)访问(它们以列表的形式返回)
例如,使用上面的matheatical.cafee示例,您的脚本将如下所示
键入'contributors()‘获取更多信息,键入'citation()’了解如何在出版物中引用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/
https://stackoverflow.com/questions/10328062
复制相似问题