Подставляя переменную для строкового аргумента в вызове функции - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь вызвать функцию, которая ожидает строку в качестве одного из аргументов.Однако попытка заменить переменную, содержащую строку, приводит к ошибке.

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 голосов
/ 15 февраля 2019

Я разработчик этого пакета.

Краткое примечание: эта функция была только что перемещена в новый пакет с именем interactions, который находится в процессе добавления в CRAN.Если вы хотите установить его до того, как он попадет в CRAN (я ожидаю, что это произойдет в течение недели), вам нужно использовать этот код для загрузки его с Github:

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

В этой новой версии,Я изменил нестандартную оценку, чтобы следовать модели 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])))
}
0 голосов
/ 17 ноября 2018

{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}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...