将命令行参数传递给方差分析

时间:2019-06-12 01:38:29

标签: r anova

简单的问题,但只有通过命令行参数传递的示例可以使用'file ='而不是任何公式。

例如data.txt

id    var1  group
1     5     1
2     6     1
3     4     1
4     12    2
5     14    2
6     20    2

为什么无法在命令行中将组变量指定为anova:./ anova.R data.txt组

#!/usr/bin/env Rscript

args <- commandArgs(trailingOnly=TRUE)

data1 <- read.table(args[1],sep="\t", header =TRUE)

result <- summary(aov(richness ~ args[2], data=data1))
write("richness",file="alphatests.txt",append=TRUE)
capture.output(result, file="alphatests.txt",append=TRUE)
  

可变长度不同(为'args [2]'找到)调用:摘要...    ->评估->评估->-> model.frame.default   执行停止

但这确实可行(当两个示例中都有一个列名“ group”时):

#!/usr/bin/env Rscript

args <- commandArgs(trailingOnly=TRUE)

data1 <- read.table(args[1],sep="\t", header =TRUE)

result <- summary(aov(richness ~ group, data=data1))
write("richness",file="alphatests.txt",append=TRUE)
capture.output(result, file="alphatests.txt",append=TRUE)

为什么我不能将命令行参数传递给公式?

2 个答案:

答案 0 :(得分:2)

我们可以使用标准方法来更改公式

result <- summary(aov(reformulate(args[2], 'richness'), data = data1))

-完整代码

#!/usr/bin/env Rscript

args <- commandArgs(trailingOnly=TRUE)

data1 <- read.table(args[1], header =TRUE)
result <- summary(aov(reformulate(args[2], 'richness'), data = data1))
print(result)

-在终端中运行脚本

$ Rscript anova.R data.txt group
#            Df Sum Sq Mean Sq F value Pr(>F)  
#group        1 160.17  160.17   17.47 0.0139 *
#Residuals    4  36.67    9.17                 
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

注意:假设data1.txt中第二列名称为“丰富”

答案 1 :(得分:1)

命令行参数以字符串形式返回,因此当您将其传递给aov函数时,它将不起作用。一种解决方法是使用get

result <- summary(aov(richness ~ get(args[2]), data=data1))