为什么在 R ggplot2::facet_grid() 中传递字符串适用于行而不适用于列?

问题描述

Here 是该问题的一些解决方法,但是您是否有理由可以在 rows 中为 ggplot2::facet_grid() 传递一个字符串,但是 不是为了cols

这是有效的(注意 rows 属性):

f_varname <- 'drv'

ggplot( mpg,aes( displ,cty ) ) + geom_point() +

    facet_grid( rows = f_varname )

但这不是(注意 cols 属性):

f_varname <- 'drv'

ggplot( mpg,cty ) ) + geom_point() +

    facet_grid( cols = f_varname )

# => Error: `cols` must be `NULL` or a `vars()` specification

相反,您必须对 vars() 使用 cols 规范:

ggplot( mpg,cty ) ) + geom_point() +
    
    facet_grid( cols = vars( drv ) )

哪个不能处理字符串:

f_varname <- 'drv'

ggplot( mpg,cty ) ) + geom_point() +
    
    facet_grid( cols = vars( f_varname ) )

# =>
# Error: At least one layer must contain all faceting variables: `f_varname`.
# * Plot is missing `f_varname`
# * Layer 1 is missing `f_varname`

链接的讨论中,这个 answer 也适用于字符串:

f_varname <- 'drv'

ggplot( mpg,cty ) ) + geom_point() +
    
    facet_grid( reformulate( f_varname ) )

解决方法

我认为@Limey 在评论中的解释是您问题的答案,但如果您正在寻找实用的解决方案(在您已链接的解决方案之外),您可以将字符串转换为符号(使用 {{1 }}) 然后使用 bang-bang 运算符将其传递给 vars,例如

sym()