在函数调用中用变量替换字符串参数
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
模型。这意味着编写一个将参数插入 pred
、modx
、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])))
}
我正在尝试调用一个需要字符串作为参数之一的函数。但是,尝试替换包含该字符串的变量会引发错误。
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
模型。这意味着编写一个将参数插入 pred
、modx
、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])))
}