从Python *args/**kwargs切入:R语言...参数为何仅输出首个额外参数?
理解R语言中的
...参数:为什么只输出第一个额外参数,以及如何遍历所有参数 嘿,刚从Python转R遇到这种困惑太正常了,毕竟两者的可变参数机制虽然类似,但用法细节差不少~我来给你拆解清楚:
为什么你的代码只输出[1] 4 5 6?
你写的print(...)在R里的行为和Python的print(*args)完全不一样!R的print()函数本身只接受第一个参数作为要打印的对象,后面的...是用来传递给其他辅助打印的参数(比如digits控制小数位数、na.print控制NA的显示方式),根本不是用来接收多个要打印的对象的。
所以当你调用print(...)时,R只会把...里的第一个额外参数(也就是c(4,5,6))传给print的主参数,剩下的c(7,8,9)和c(10,11,12)直接被忽略了,这就是为什么只输出第一个额外参数的原因。
如何遍历多个额外参数?
和Python的*args类似,R的...是用来收集额外的位置参数的,但要处理这些参数,你需要先把它们转换成一个列表——这是R里处理可变参数的常规操作。
方法1:把...转成列表后遍历
修改你的函数,先将...转换成列表,然后就可以像遍历普通列表一样操作每个参数了:
test <- function(x, ...) { # 把所有额外参数收集到列表里 extra_args <- list(...) # 遍历列表中的每个元素 for (arg in extra_args) { print(arg) } } # 调用测试 test(x=c(1,2,3), c(4,5,6), c(7,8,9), c(10,11,12))
运行后就会依次输出所有额外参数:
[1] 4 5 6 [1] 7 8 9 [1] 10 11 12
方法2:一次性打印所有额外参数
如果只是想一次性查看所有额外参数,直接打印转换后的列表就行:
test <- function(x, ...) { print(list(...)) } test(x=c(1,2,3), c(4,5,6), c(7,8,9), c(10,11,12))
输出会是一个包含所有额外参数的列表:
[[1]] [1] 4 5 6 [[2]] [1] 7 8 9 [[3]] [1] 10 11 12
小总结:R的... vs Python的*args
- 两者都是用来收集额外的位置参数,但R的
...不能直接像Python的*args那样展开给函数(除非函数本身支持接收多个对象) - 处理R的
...时,核心是先转成list(...),之后就可以用所有列表操作来处理这些参数了
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

