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

Substituting variable for string argument in function call

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

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

{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} 这样的普通绘图库自己制作绘图。

我是这个包的开发者。

简短说明:此功能刚刚移至名为 interactions 的新包中,该包正在添加到 CRAN 中。如果你想在它到达 CRAN 之前安装它(我希望这会在一周内发生),你需要使用此代码从 Github:

下载它
if (!requireNamespace("remotes") {
  install.packages("remotes")
}
remotes::install_github("jacob-long/interactions")

在这个新版本中,我将非标准评估更改为遵循 tidyeval 模型。这意味着编写一个将参数插入 predmodx、and/or mod2.

的函数应该更直接

例如:

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])))
}