为何dplyr::mutate_all调用带空括号的函数无变更且无报错?
问题解析:mutate_all中调用带空括号函数无效果也不报错的原因
这确实是个容易踩的小坑!咱们来一步步拆解为什么会出现这种情况:
1. 带括号 vs 不带括号的本质区别
当你写 as.character(不带括号)时,你传递给mutate_all的是函数本身——mutate_all会自动把每一列作为参数传给这个函数,完成类型转换。
但当你写 as.character()(带括号)时,你是立即执行了这个函数,得到的结果是character(0)(一个空的字符向量),然后把这个空向量传给了mutate_all。
2. mutate_all对传入值的处理逻辑
mutate_all的.fns参数不仅可以接受函数,还能接受常量值、公式或者字符向量:
- 如果传入的是普通常量值,它会自动把这个值重复对应列的行数后,赋值给每一列。
- 但这里你传入的是
character(0)(长度为0的向量),R在处理这种情况时,无法完成循环扩展赋值,所以最终每一列都保持了原来的样子。
3. 为什么没有报错或警告?
因为as.character()本身是合法的函数调用(R允许不带参数调用它,返回空字符向量),而mutate_all也能合法处理传入的空向量——这种情况不属于语法或逻辑错误,只是完全不符合你的预期而已。
验证这个逻辑
我们可以手动验证as.character()的返回值,再看看传入空向量的效果:
# 执行as.character()的结果 as.character() #> character(0) # 手动传入空向量给mutate_all,和你的例子结果一致 sample_df %>% mutate_all(character(0)) %>% str #> Classes 'tbl_df', 'tbl' and 'data.frame': 3 obs. of 2 variables: #> $ id : int 1 2 3 #> $ name: chr "a" "b" "c"
正确的写法
除了直接传函数名as.character,你还可以用公式语法(适合需要自定义逻辑的场景):
sample_df %>% mutate_all(~as.character(.)) %>% str #> Classes 'tbl_df', 'tbl' and 'data.frame': 3 obs. of 2 variables: #> $ id : chr "1" "2" "3" #> $ name: chr "a" "b" "c"
内容的提问来源于stack exchange,提问作者tjebo
相关产品推荐
相关产品推荐

