在函数调用中用变量替换字符串参数

时间:2018-11-17 17:41:14

标签: r linear-regression interaction

我正在尝试调用将字符串作为参数之一的函数。但是,尝试替换包含字符串的变量会引发错误。

library(jtools)

# Fit linear model
fitiris <- lm(Petal.Length ~ Petal.Width * Species, data = iris)

# Plot interaction effect: works!
interact_plot(fitiris, pred = "Petal.Width", modx = "Species")

# Substitute variable name for string: doesn't work!
predictor <- "Petal.Width"
interact_plot(fitiris, pred = predictor, modx = "Species")

Error in names(modxvals2) <- modx.labels : 
  attempt to set an attribute on NULL

2 个答案:

答案 0 :(得分:5)

{jtools}使用非标准评估,因此您可以指定未加引号的列名,例如

library(jtools)

fitiris <- lm(Petal.Length ~ Petal.Width * Species, data = iris)

interact_plot(fitiris, pred = Petal.Width, modx = Species)

...但是它没有被可靠地实现,因此您遇到的(常见!)情况破坏了它。如果确实需要它工作,则可以使用bquote来重组调用(使用.(...)替换要替换的内容),然后使用eval运行它:

predictor <- "Petal.Width"
eval(bquote(interact_plot(fitiris, pred = .(predictor), modx = "Species")))

...但是这正在深入R中。一种更好的方法是使用{ggplot2}之类的普通绘图库自己制作绘图。

答案 1 :(得分:2)

我是这个软件包的开发者。

简短说明:该函数刚刚移到一个名为interactions的新程序包中,该程序包正在添加到CRAN中。如果要在到达CRAN之前安装它(我希望这会在一周之内发生),则需要使用以下代码从Github下载它:

tidyeval

在这个新版本中,我更改了非标准评估以遵循pred模型。这意味着编写一个将参数插入modxmod2和/或library(interactions) plot_wrapper <- function(my_model, my_pred, my_modx) { interact_plot(my_model, pred = !! my_pred, modx = !! my_modx) } fiti <- lm(Income ~ Frost + Murder * Illiteracy, data = as.data.frame(state.x77)) plot_wrapper(fiti, my_pred = "Murder", my_modx = "Illiteracy") # Works pred_var <- "Murder" modx_var <- "Illiteracy" plot_wrapper(fiti, my_pred = pred_var, my_modx = modx_var) # Works 的函数应该更直接。

例如:

variables <- c("Murder", "Illiteracy")
for (var in variables) {
  print(interact_plot(fiti, pred = !! var, modx = !! (variables[variables != var])))
}

或者仅给出一个在循环中使用变量的示例...

{{1}}