r - 为什么 'neutral' 括号会导致 R 中的错​​误(或者可能是 tidyverse)?

标签 r dplyr

当我有大量复杂的代码块时,我通常会使用比要求更多的括号集。我的代码可能如下所示:

library(tidyverse)
mtcars %>% 
  mutate(name = rownames(.)) %>% 
  filter((cyl == 4 & grepl("Toyota", name)) | 
           ((cyl == 6 | cyl == 8), grepl("Mazda", name)))

而不是这个:

mtcars %>% 
  mutate(name = rownames(.)) %>% 
  filter(cyl == 4 & grepl("Toyota", name) | 
           (cyl == 6 | cyl == 8, grepl("Mazda", name)))

我能说什么?在我的脑海中,括号保护帮助我更容易地理解德摩根定律、PEMDAS、计算顺序等。

这种对括号的随意使用带来了问题。尽管我认为额外的括号在 R 和 tidyverse 中应该是中性的,但它们似乎不是。看看我在下面的代码块中遇到的错误。

mtcars %>% filter((cyl == 4 & am == 1)) %>% .[1, 3]
# [1] 108
mtcars %>% filter((cyl == 4, am == 1)) %>% .[1, 3]
# Error: unexpected ',' in "mtcars %>% filter((cyl == 4,"

为什么上面的第一个示例可以运行,而第二个会抛出错误?我知道直接的答案是“你用了太多括号”,但为什么我不能呢?对我来说,在这些逻辑运算符巢穴噩梦中,它只会让生活更轻松。我知道 case_when() 函数在这种情况下确实有帮助。我仍然想知道为什么我不能使用额外的括号。谢谢。

最佳答案

这里的问题是您正在使用过滤器的“功能”,即传递给 ... 并用逗号分隔的条件是“自动”与 & 连接的>。但是使这项工作发挥作用的解析魔法还不够聪明,无法看穿一组括号。

所以它只看到一个条件,cyl == 4, am == 1,它作为单个 bool 表达式在语法上并不是真正有效的。这也是我不喜欢这个功能,总是写出&的原因之一。

我怀疑由于 filter 的这个功能实现起来相当复杂,因此尝试让它以更递归的方式解析条件并没有太大的好处。可能不令人满意的答案是,如果您正在做一些非常简单的事情,用逗号分隔的传递条件很好,但如果您的 bool 条件很复杂,您应该更明确。

关于r - 为什么 'neutral' 括号会导致 R 中的错​​误(或者可能是 tidyverse)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56568578/

相关文章:

r - SMOTE - 多类

r - 仅针对重要的拟合绘制 geom_smooth

r - 添加误差线以在R中的图上显示标准偏差

r - 使用 dplyr 创建多功能描述表

r - 如何根据条件在 R 中上下移动整行?

r - 在单个 R data.table 中按组有效地锁定

r - 使用 R,将可变行数中的文本组合成单个文本元素

c# - 在 R 中,如何以 yyyymmdd 格式输出 lubridate 兼容日期? .NET 中相当于 .ToString ("yyyyMMdd")?

r - 从分组数据中选择随机的观察组(行)

r - 在 dpylr 中使用左连接来匹配和填充数据框 R