R 4.2原生管道占位符_工作机制与代码改写方法咨询
R 4.2 原生管道占位符
_使用指南与代码改写方案 首先明确占位符的核心硬规则,这是所有用法的前提:
- 占位符
_仅能直接作为函数调用的顶层命名参数值使用,不能嵌入嵌套计算表达式、不能出现在函数内部的逻辑代码中 - 一旦调用中使用了
_,管道左侧传入的值就不会自动填充到函数的第一个参数位,所有需要用到传入值的位置都必须显式写_指定 _仅代表管道传入的对象本身,不能像magrittr管道的.那样,直接在任意位置代表传入对象做二次计算
原有代码的问题与改写
你提供的匿名函数写法逻辑是通顺的,但没有必要在所有步骤都套一层{ \(.) xxx }()的匿名函数壳,符合原生占位符规范的改写版本如下:
x = c(NA, NA, 1, NA, 1, 2) m = matrix(x, nrow = 3, ncol = 2) m # [,1] [,2] # [1,] NA NA # [2,] NA 1 # [3,] 1 2 #### CHECK FOR MISSING VALUES #### m |> # 这一步需要对传入的矩阵做is.na、NROW、NCOL三次嵌套计算,无法直接用_实现,保留简化匿名函数即可 (\(mat) .colSums(is.na(mat), NROW(mat), NCOL(mat)))() |> # 这一步管道传入值是rbind的第二个参数,直接用_占位即可,无需额外写匿名函数 rbind(names(m), _) |> t() # [,1] [,2] # [1,] NA NA # [2,] 2 1
注:输出第一行为NA是因为你创建的矩阵
m没有设置列名,names(m)返回NULL,和原有匿名函数写法的运行结果完全一致。
常见正误用法示例
你可以对照下面的例子快速避坑:
- 正确用法:传入值作为非首个参数的顶层值
# 等价于 grepl(pattern = "hello", x = "hello world") "hello world" |> grepl("hello", x = _) # 运行返回 TRUE - 错误用法:
_出现在嵌套表达式中# 会直接报错:placeholder '_' can only be used as a top-level argument m |> .colSums(is.na(_), NROW(_), NCOL(_)) - 正确用法:同一个调用中多次使用
_# 等价于 seq(from = 1, to = 5, by = 1) 5 |> seq(from = 1, to = _, by = 1) # 运行返回 1 2 3 4 5
内容的提问来源于stack exchange,提问作者Bezzus
相关产品推荐
相关产品推荐

