何时使用...length()与rlang::dots_n(...)?二者差异解析
...length() 和 rlang::dots_n(...) 的关键差异
1. 空参数的计数逻辑不一样
...length()会把显式传入的空位置(比如调用my_func(,,))也算成参数,返回3。rlang::dots_n(...)默认忽略这些空参数,同样调用返回0;要是想统计空参数,得加include_empty = TRUE参数,这时才会返回3。
2. 参数计算的触发行为不同
...length()统计时会强制运行所有传入的参数,如果某个参数是耗时操作(比如Sys.sleep(10))或者有副作用(比如写文件),会直接触发执行。比如my_func <- function(...) ...length(); my_func(Sys.sleep(5), 1)会先等5秒才返回2。rlang::dots_n(...)只统计数量,不会触发参数的执行,上面的例子会立刻返回2,完全不会等sleep跑完。
3. 支持筛选命名/未命名参数
...length()不管参数有没有名字,只要传了就计数,没法筛选。rlang::dots_n(...)可以通过named参数精准统计:named = TRUE只算带名字的参数,named = FALSE只算没名字的,默认是全算。比如my_func <- function(...) rlang::dots_n(..., named = TRUE); my_func(a=1, 2, b=3)会返回2。
4. 依赖与生态适配
...length()是基础R自带的,不用装任何额外包,适合轻量场景或者不想引入依赖的函数。rlang::dots_n(...)属于tidyverse生态,和同包的dots_list()、dots_values()等工具配合更顺畅,适合用tidyverse栈的项目。
内容的提问来源于stack exchange,提问作者Dan Chaltiel
相关产品推荐
相关产品推荐

