2016-03-14 160 views
1

我试图做一个函数,它将运行并比较给定数据集和变量名的一组模型(实质上是为了能够更改一个模型集并让它们应用到所有相关的因变量 - 选择一个先验模型集进行比较而不是使用像glmulti这样的数据挖掘现有函数)。一个简单的例子:输入变量名称作为函数的参数

RunModelset<- function(dataset, response) 
{ 
    m1 <- lm(formula=response ~ 1, data=dataset) 
    m2 <- lm(formula=response ~ 1 + temperature, data=dataset) 
    comp <- AICctab(m1,m2, base = T, weights = T, nobs=length(data)) 
    return(comp) 
} 

如果我在函数内手动输入一个特定的变量名称,它会正确运行模型。然而,使用上面的代码和输入文本值的响应参数不起作用:

RunModel(dataset=MyData,response="responsevariablename") 

产生一个错误:无效型(NULL)为变量“数据集$响应”,其解读为意味着它没有找到我要告诉它使用的列。我的问题必须是R如何在函数中插入文本值作为参数。

如何输入响应变量名称,以便R知道“formula = response〜”变成“formula = dataset $ responsevariablename〜”?基于this solution

ETA工作答案

RunModel<- function(dataset, response) 
{ 
resvar <- eval(substitute(response),dataset) 
m1 <- lm(formula=resvar ~ 1, data=dataset) 
m2 <- lm(formula=resvar ~ 1 + R.biomass, data=dataset) 
comp <- AICctab(m1,m2, base = T, weights = T, nobs=length(data)) 
return(comp) 
} 

RunModel(dataset=MyData,response=responsevariablename) 

NB - 当我对响应参数报价并没有工作。

+0

试'RunModel(数据集=迈德特,响应= as.name( “responsevariablename”))' – Jthorpe

+0

也许使用'式(paste0(文本, “〜”,变量, “+”,变量2 ))' – cory

回答

0

你应该可以使用match.call()来实现这一点。

参见this post

+0

我无法获得match.call的工作,但eval(substitute())[solution](http://stackoverflow.com/questions/19133980/passing-a-variable-name-to-a - 功能在r/19134129#19134129)张贴在这个问题上的伎俩。谢谢! – Megachile

+2

虽然这可能在理论上回答这个问题,[这将是更可取的](// meta.stackoverflow.com/q/8259)在这里包括答案的基本部分,并提供参考链接。 –

+0

我是否应该编辑克强的答案,提供我自己的答案或只是将我的解决方案粘贴到评论中? – Megachile