You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:16:06