当我拥有大量复杂的代码块时,经常会使用比所需更多的括号集。我的代码可能如下所示:
library(tidyverse)
mtcars %>%
mutate(name = rownames(.)) %>%
filter((cyl == 4 & grepl("Toyota", name)) |
((cyl == 6 | cyl == 8), grepl("Mazda", name)))
Run Code Online (Sandbox Code Playgroud)
代替这个:
mtcars %>%
mutate(name = rownames(.)) %>%
filter(cyl == 4 & grepl("Toyota", name) |
(cyl == 6 | cyl == 8, grepl("Mazda", name)))
Run Code Online (Sandbox Code Playgroud)
我能说什么 在我的脑海中,括号保护使我更容易了解De Morgan的定律,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,"
Run Code Online (Sandbox Code Playgroud)
为什么第一个上面的示例起作用,而第二个示例抛出错误?我知道直接的答案是“您使用了太多的括号”,但是为什么不能呢?在我看来,在这些逻辑运算符嵌套的噩梦中,这只会使生活更轻松。我知道该case_when()功能在此类情况下会有所帮助。我仍然想知道为什么我不能使用多余的括号。谢谢。
这里的问题是,您使用的是过滤器的“功能”,传入...和以逗号分隔的条件会自动与结合在一起&。但是,使这项工作有效的解析魔术不够聪明,无法透视一组parens。
因此,它只看到一个条件,cyl == 4, am == 1作为单个布尔表达式在语法上实际上并不有效。这就是为什么我不喜欢此功能并始终写出的原因之一&。
我怀疑由于该功能的filter实现相当复杂,因此试图以一种更递归的方式解析它的条件并没有太大的好处。可能不令人满意的答案是,如果您执行的操作非常简单,则以逗号分隔的传递条件会很好,但是如果布尔条件很复杂,则应该更加明确。
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |