Как смешать нестандартную и стандартную оценку в аргументах взаимодействия (...) внутри ggplot ()? - PullRequest
0 голосов
/ 09 мая 2018

Я ищу способ использовать NSE внутри аргумента (в данном случае, пересечь) в dplyr с использованием пакета rlang.

Фрейм данных:

df <- data.frame(time=as.factor(c(10,10,10,10,20,20,20,20,10,10,10,10,20,20,20,20)),
                 cost=as.factor(c(10,20,30,40,10,20,30,40,10,20,30,40,10,20,30,40)),
                 type=c("a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b"),
                 value=c(40,20,25,10,80,50,30,60,15,70,80,10,50,20,30,40))

## Set variables for NSE
a <- "time"
b <- "cost"
c <- "type"
d <- "value"

nse_a <- sym(a)
nse_b <- sym(b)
nse_c <- sym(c)
nse_d <- sym(d)

Я могу правильно построить в SE.

## Plot in SE
df %>% ggplot(aes(x=cost, y=value, group=interaction(time,type), color=time, linetype=type)) + geom_line(size=1.2)

enter image description here

Однако, когда я использую NSE, возникает ошибка:

## Plot in NSE
df %>% ggplot(aes_(x=nse_b, y=nse_d, group=interaction(nse_a,nse_c), color=nse_a, linetype=nse_c)) + geom_line(size=1.2)

Error: unique.default(x, nmax = nmax)
unique() applies only to vectors

Это работает, если я удаляю group=intersection(...). Я полагаю, что причиной может быть использование NSE во вложенном аргументе 'intersect (...)' внутри aes_.

Есть ли у вас решение, чтобы избежать этой ошибки?

Я искал похожие темы и пытался применить некоторые примеры, такие как отмена цитат !! nse_a, но это не сработало. Я новичок в NSE и до сих пор не очень хорошо понимаю манеру манипуляции.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы можете передать только аргументы в кавычках aes_(), поэтому interaction нужно заключать в кавычки, но для этого нужны аргументы без кавычек (не совсем уверен насчет терминологии, извините за путаницу)

library(rlang)
library(ggplot2)


interact <- quo(interaction(!!nse_a, !!nse_c))

df %>%
ggplot(aes_(x=nse_b, 
            y=nse_d, 
            group=interact, 
            color=nse_a, 
            linetype=nse_c)) + 
    geom_line(size=1.2)

# or equally

df %>% 
  ggplot(aes_(x=nse_b, 
              y=nse_d, 
              group=quo(interaction(!!nse_a, !!nse_c)), 
              color=nse_a, 
              linetype=nse_c)) + 
  geom_line(size=1.2)

Создано в 2018-05-09 пакетом представ. (v0.2.0).

0 голосов
/ 09 мая 2018

Base R's interaction не работает с rlang, что, в общем, относится только к развороту. (РЕДАКТИРОВАТЬ: но см. Ответ GGamba, который показывает, как использовать !! для передачи аргументов NSE в стандартные функции.)

Почти наверняка самое простое решение - создать переменную взаимодействия самостоятельно.

df$mygroup <- interaction(df$time, df$type)

Теперь используйте mygroup внутри вашего ggplot вызова.

Делая это, вы избегаете ада NSE.

...