gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:13:17 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com