我有一个非常基本的问题。
我是 R 的新用户,这些天我正在使用一个 R 包进行分析,我必须运行该包的 R 命令列表才能获得所需的输出。我想制作我的分析管道并将其自动化,以便我可以使用一个带有所需参数的 R 命令来完成我的工作。
我们在 shell 脚本中做的这类工作(我们在其中添加了许多 linux 命令、awk/sed/perl 行
请提供一些有关如何执行此操作的链接,我将不胜感激。
我有一个非常基本的问题。
我是 R 的新用户,这些天我正在使用一个 R 包进行分析,我必须运行该包的 R 命令列表才能获得所需的输出。我想制作我的分析管道并将其自动化,以便我可以使用一个带有所需参数的 R 命令来完成我的工作。
我们在 shell 脚本中做的这类工作(我们在其中添加了许多 linux 命令、awk/sed/perl 行
请提供一些有关如何执行此操作的链接,我将不胜感激。
假设这是我的分析管道:我想从具有均值MU
和标准差的正态分布中生成 10 个数字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
}
现在在 RI 中可以做myFunction(1, .5, 10)
,将我必须输入的命令数量减少到 1。
我可以写一个脚本文件myScript.r
。这就像一个 bash 脚本,只是它是一个 R 命令列表。
我可以把我原来的命令列表放在那里,或者我可以把我的函数放在那里,并在底部加上一条附加语句myFunction(1,.5,10)
。
然后在R 中,我可以这样做:
source('myScript.r')
它将运行脚本中的所有 R 命令。
如果你想从 shell 获取这个脚本,我建议你有一个myScript.r
包含函数的文件。
然后检查Rscript(你可以?Rscript
从 R 中)。这是默认安装的 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 脚本。
函数可能是您正在寻找的
foo <- function() {
data <- data.frame(a=1:10, b=10:1)
plot(data)
# many more commands here
}
然后你可以打电话foo()
并运行所有命令。
有关更深入的信息,请参阅R 帮助。
您也source()
可能感兴趣,请参阅?source
。
另一种选择是使用 Rscript 运行您的程序。可以使用函数访问命令行中的参数args <- commandArgs(trailingOnly=TRUE)
(它们作为列表返回)
例如,使用上面的 math.coffee 示例,您的脚本看起来像
输入“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/