【问题标题】:entering variable name as argument of a function输入变量名作为函数的参数
【发布时间】:2016-03-14 19:10:44
【问题描述】:

我正在尝试创建一个函数,该函数将运行并比较给定数据集和变量名称的一组模型(本质上是为了能够仅更改一个模型集并将它们应用于所有相关的因变量 - 选择一个先验模型集进行比较,而不是使用像 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") 

产生一个错误:变量“dataset$response”的类型无效(NULL),我解释为它没有找到我告诉它使用的列。我的问题一定是 R 如何在函数中插入文本值作为参数。

如何输入响应变量名称以便 R 知道“formula=response ~”变为“formula=dataset$responsevariablename ~”?

ETA 工作答案基于this solution

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)

注意 - 当我在响应参数上有引号时,这不起作用。

【问题讨论】:

  • 试试RunModel(dataset=MyData,response=as.name("responsevariablename"))
  • 也许使用formula(paste0(text, "~", variable, "+", variable2))

标签: r function arguments


【解决方案1】:

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

this post

【讨论】:

  • 我无法让 match.call 工作,但在该问题上发布的 eval(substitute()) solution 可以解决问题。谢谢!
  • 虽然这在理论上可以回答问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
  • 我应该编辑克强的答案,提供我自己的答案还是将我的解决方案粘贴到此处的评论中?
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多