用dplyr写T而不是TRUE

时间:2018-06-18 16:01:54

标签: r dplyr

懒惰,我经常使用缩写T作为TRUE。在这里,我观察到dplyr的奇怪行为,并不总是被接受。

此示例崩溃(incompatible value for ``na.rm`` argument):

df = head(iris)
mutate(df, n = n_distinct(Species, na.rm=T))

但这些例子有效:

mutate(df, n = n_distinct(Species, na.rm=TRUE))
df$n = n_distinct(df$Species, na.rm=T)
mutate(df, m = mean(Sepal.Length, na.rm=T))

当然,这里的简单修复是避免缩写并输入TRUE。但这也不起作用:

b = TRUE
mutate(df, n = n_distinct(Species, na.rm=b))

这种行为有什么可以理解的解释吗?某种程度上非标准评估?知道要避免什么会帮助我减少调试代码的时间。

2 个答案:

答案 0 :(得分:1)

始终建议使用全名而不是缩写TF,因为当对象存在名称TF时,这会导致问题。但是,我们无法将TRUE等保留字指定为名称

TRUE <- 1:5
  

TRUE错误&lt; - 1:5:无效(do_set)左侧分配

尽管字符串或反引号可以执行此操作

`TRUE` <- 1:5 # but it is not recommended

检查对象的一个​​选项是使用bang-bang操作符

out1 <- mutate(df, n = n_distinct(Species, na.rm=!!T))
out2 <- mutate(df, n = n_distinct(Species, na.rm=!!b))
out3 <- mutate(df, n = n_distinct(Species, na.rm=TRUE))
identical(out1, out3)
#[1] TRUE
identical(out1, out2)
#[1] TRUE

答案 1 :(得分:1)

这是由于现已修复的错误所致。感谢Tidyverse团队!

https://github.com/tidyverse/dplyr/issues/3686