在mutate\u if.predicate参数中正确使用rlang::as\u函数公式
我想使用在mutate\u if.predicate参数中正确使用rlang::as\u函数公式,r,dplyr,mutate,rlang,R,Dplyr,Mutate,Rlang,我想使用~.%1==0在中的公式。谓词的参数如果发生变化,则按以下方式进行: dta %>% mutate_if(.predicate = ~ . %% 1 == 0, .funs = funs(. + 10)) f_rlang_check <- rlang::as_function( ~ . %% 1 == 0) f_rlang_check(c(1.1, 1)) [1] FALSE TRUE 其中,dta对应于以下TIBLE: dta
~.%1==0
在中的公式。谓词的参数
如果
发生变化,则按以下方式进行:
dta %>%
mutate_if(.predicate = ~ . %% 1 == 0,
.funs = funs(. + 10))
f_rlang_check <- rlang::as_function( ~ . %% 1 == 0)
f_rlang_check(c(1.1, 1))
[1] FALSE TRUE
其中,dta
对应于以下TIBLE:
dta <- tibble(colA = c("a", "b"),
colB = 1:2,
colC = c(1.1, 2.2))
显然,这个公式是正确的;但是,它不能直接传递给,如上所示
dta %>%
mutate_if(.predicate = f_rlang_check,
.funs = funs(. + 10))
如果将尝试对所有列的谓词函数求值,则会产生相同的错误
mutate\u,因此在尝试将二进制运算符%%
与非数字参数colA
一起使用时会出现错误。您可以使用is.numeric
和&&
解决此问题
谓词应返回单个逻辑值,因此您可能希望使用all
或any
dta %>%
mutate_if(.predicate = ~ is.numeric(.) && all(. %% 1 == 0),
.funs = funs(. + 10))
非常感谢,现在我知道问题出在哪里了。为什么决定使用&
插入部分&
,如果在使用.谓词时只关注第一个值的比较,或总是逐个比较,则存在错误结果的风险?如果使用&
,则将对&
的两侧进行评估,在这种情况下会产生错误。使用&&
,只有当LHS为真时,才会对RHS进行评估(如果为假
,则总结果为假
,因此不需要检查RHS)。文档以一种不明显的方式说明了这一点,即“评估仅在确定结果之前进行”。非常好,非常感谢。