如何在R语言中结合管道符使用ifelse()函数
如何在R中用管道符配合ifelse()函数
先看你原本可以正常运行的代码:
x <- sample(-5:5,10,replace = T) x # 输出示例:[1] 0 0 2 -1 1 3 1 3 4 -2 ifelse( sign(x) >= 0,1,-1) # 输出示例:[1] 1 1 1 -1 1 1 1 1 1 -1
你尝试用管道符改写时触发了错误:
x |> sign() |> ifelse(. >= 0, 1, -1) # 报错信息: # Error in ifelse(sign(x), . >= 0, 1, -1) : unused argument (-1)
问题出在哪
管道符|>会自动把前一步的输出作为下一个函数的第一个参数传入。上面的代码里,sign()处理后的结果被直接塞给了ifelse()的第一个参数,这就导致你写的. >=0变成了ifelse的第二个参数,1是第三个,-1成了多余的第四个参数,所以报错说有未使用的参数。
正确的管道写法
这里提供两种简单的修正方式:
- 用匿名函数明确控制参数传递(R 4.1+支持的简写语法):
x |> sign() |> (\(y) ifelse(y >= 0, 1, -1))()
也可以用传统的匿名函数写法:
x |> sign() |> { function(y) ifelse(y >= 0, 1, -1) }()
- 如果你的环境里装了
magrittr包,用它的%>%管道符会更直观,它默认把前一步结果作为.传递,不需要额外包裹:
library(magrittr) x %>% sign() %>% ifelse(. >= 0, 1, -1)
两种写法都能得到和原代码完全一致的输出结果。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

