【发布时间】:2015-03-14 12:52:20
【问题描述】:
我想使用dplyr 对以下计算进行参数化,以找出Sepal.Length 的哪些值与Sepal.Width 的多个值相关联:
library(dplyr)
iris %>%
group_by(Sepal.Length) %>%
summarise(n.uniq=n_distinct(Sepal.Width)) %>%
filter(n.uniq > 1)
通常我会这样写:
not.uniq.per.group <- function(data, group.var, uniq.var) {
iris %>%
group_by(group.var) %>%
summarise(n.uniq=n_distinct(uniq.var)) %>%
filter(n.uniq > 1)
}
但是,这种方法会引发错误,因为dplyr 使用了non-standard evaluation。这个函数应该怎么写?
【问题讨论】:
-
作为风格问题,我建议不要在现代 R 中的名称中使用点,S3 泛型除外。这非常令人困惑。
dplyr使用的(以及其他)命名约定要好得多:names_with_underscores。 -
我知道Hadley Wickham's style guide 推荐使用下划线表示法,但Google R style guide 提倡使用句点(尽管不是用于函数,我在这里做过)。在其他语言中,句点用于成员访问(例如 javascript 中的
myArray.length),R 中是否存在其他冲突? -
Google 风格指南通常很糟糕。在这个特定的例子中,问题在于它会导致 S3 方法产生歧义:
some.class.method是some类class.method的方法,还是some.class类method的方法?此外,当您的部分代码在 C(++) 中实现时,它会导致名称不一致,因为这不支持名称中的点,因此需要将后端函数名称映射到不同的 R 名称。
标签: r dplyr lazy-evaluation