为何facet_grid列位置可省略'.'占位符,行位置省略会报错?
facet_grid省略点号行为差异的原因 这个不对称表现和facet_grid自身的功能逻辑无关,完全是R原生公式语法的规则导致的,两种情况都不属于bug:
- R里的
~是公式运算符,原生支持仅右侧写变量、左侧留空的单侧公式写法,做回归、写purrr风格匿名函数时常会用到~ .x + 1这类写法,属于标准合法语法。这种写法传入facet_grid时,函数会自动把空的左侧识别为「行维度不做分面」,和显式写. ~ cyl的效果完全一致,所以第2组代码能正常运行,本质是R语法层面天然支持这种格式。 - 反过来R语法从解析层就不允许
~左侧有内容、右侧完全为空的写法,这种代码根本跑不到facet_grid的内部逻辑,在语法解析阶段就会直接抛错。哪怕你脱离ggplot2,直接在R控制台输入cyl ~,都会得到一模一样的语法报错,和分面功能的设计没有任何关系。
可以用最基础的代码验证这个规则:
# 仅右侧有变量的单侧公式:合法,可正常解析为公式对象 class(~ cyl) # [1] "formula" # 左侧有变量、右侧为空:直接触发语法错误,无法完成解析 cyl ~ # Error: unexpected '<eof>' in "cyl ~"
官方文档推荐用.显式标记不分面的维度,主要是为了提升代码可读性,避免其他人读代码时搞混分面方向。省略点号的~ cyl虽然能跑,但属于依托原生语法的兼容写法,日常写代码还是建议按文档标准写全;而cyl ~的报错是R基础语法的限制,不是ggplot2的问题。
内容的提问来源于stack exchange,提问作者pvelayudhan
相关产品推荐
相关产品推荐

