2

我有一个非常基本的问题。

我是 R 的新用户,这些天我正在使用一个 R 包进行分析,我必须运行该包的 R 命令列表才能获得所需的输出。我想制作我的分析管道并将其自动化,以便我可以使用一个带有所需参数的 R 命令来完成我的工作。

我们在 shell 脚本中做的这类工作(我们在其中添加了许多 linux 命令、awk/sed/perl 行

请提供一些有关如何执行此操作的链接,我将不胜感激。

4

3 回答 3

14

假设这是我的分析管道:我想从具有均值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 终端中。有几种方法可以“自动化”这一点。

1.写一个函数

我将要执行的命令列表包含在一个大函数中,并将我的参数作为函数参数:

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。

2. 编写脚本

我可以写一个脚本文件myScript.r。这就像一个 bash 脚本,只是它是一个 R 命令列表。

我可以我原来的命令列表放在那里,或者我可以把我的函数放在那里,并在底部加上一条附加语句myFunction(1,.5,10)

然后R 中,我可以这样做:

source('myScript.r')

它将运行脚本中的所有 R 命令。

3.从外壳

如果你想从 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 脚本。

于 2012-04-26T06:31:11.850 回答
2

函数可能是您正在寻找的

foo <- function() {
 data <- data.frame(a=1:10, b=10:1)
 plot(data)

  # many more commands here
}

然后你可以打电话foo()并运行所有命令。

有关更深入的信息,请参阅R 帮助。

您也source()可能感兴趣,请参阅?source

于 2012-04-26T06:15:36.433 回答
0

另一种选择是使用 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/

于 2016-04-01T07:14:42.097 回答