如何在ggplot()内的交互(...)参数中混合非标准和标准评估?

时间:2018-05-09 10:17:03

标签: r ggplot2 dplyr interaction nse

我正在寻找一种方法,使用dplyr包在rlang中使用NSE内部参数(在这种情况下,相交)。

数据框:

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&#39; intersect(...)&#39;在aes_内。

您是否有任何解决方案可以避免此错误?

我搜索了类似的主题,并试图应用一些例子,例如!! nse_a的unquoting,但它没有用。我是NSE&#39;的新手。并且仍然不太了解它的操纵方式。

2 个答案:

答案 0 :(得分:2)

你只能将引用的参数传递给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)

reprex package(v0.2.0)创建于2018-05-09。

答案 1 :(得分:0)

Base R&#39; interaction不能与rlang一起使用,!!通常只适用于整数。 (编辑:但请参阅GGamba的答案,其中显示了如何使用df$mygroup <- interaction(df$time, df$type) 将NSE参数传递给标准函数。)

几乎可以肯定,最简单的解决方案是自己创建交互变量。

mygroup

现在在ggplot来电中使用href

这样做可以避免NSE地狱。