我正在尝试调用将字符串作为参数之一的函数。但是,尝试替换包含字符串的变量会引发错误。
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
答案 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
模型。这意味着编写一个将参数插入modx
,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])))
}
或者仅给出一个在循环中使用变量的示例...
{{1}}