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

Why passing a string in R ggplot2::facet_grid() works for rows but not for columns?

Here 是该问题的一些解决方法,但是您 可以在 [=17= 中为 rows 传递字符串是有原因的] 但 不适用于 cols?

这个有效(注意 rows 属性):

f_varname <- 'drv'

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

    facet_grid( rows = f_varname )

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

f_varname <- 'drv'

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

    facet_grid( cols = f_varname )

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

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

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

哪个不能处理一个字符串:

f_varname <- 'drv'

ggplot( mpg, aes( displ, 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, aes( displ, cty ) ) + geom_point() +
    
    facet_grid( reformulate( f_varname ) )

我认为@Limey 在评论中的解释是你问题的答案,但如果你正在寻找一个实用的解决方案(在你链接的那些之外),你可以将字符串变成一个符号(使用 sym()) 然后使用 bang-bang 运算符将其传递给 vars,例如

library(tidyverse)
f_varname <- sym("cyl")
ggplot(mpg, aes(displ, cty)) +
  geom_point() +
  facet_grid(cols = vars(!!f_varname))