懒惰,我经常使用缩写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))
这种行为有什么可以理解的解释吗?某种程度上非标准评估?知道要避免什么会帮助我减少调试代码的时间。
答案 0 :(得分:1)
始终建议使用全名而不是缩写T
或F
,因为当对象存在名称T
或F
时,这会导致问题。但是,我们无法将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团队!