如何纯粹在基础R(“基础管道”)中进行管道传输?

2024-01-07

有没有一种方法可以在基本 R 中进行管道传输,而无需定义自己的函数(即“开箱即用”的函数),并且无需加载任何外部包?

也就是说,magrittr 管道的一些(基础 R)替代品%>%。可能在即将发布的 R 版本中(?)

R 4.0.3 中提供此功能吗?如果没有,它是在哪个 R 版本中找到的,如果是,这是如何实现的?


In R |>用作管道运算符。 (自 4.1.0 起)

左边的表达式lhs插入为第一次自由论证在对右侧表达式的调用中rhs.

mtcars |> head()                      # same as head(mtcars)
#                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
#Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
#Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
#Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
#Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
#Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

mtcars |> head(2)                     # same as head(mtcars, 2)
#              mpg cyl disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
#Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4

也可以使用命名参数与占位符_ in the rhs调用以指定在哪里lhs是要插入的。占位符只能出现once on the rhs。 (自 4.2.0 起)

mtcars |> lm(mpg ~ disp, data = _)
#mtcars |> lm(mpg ~ disp, _)  #Error: pipe placeholder can only be used as a named argument
#Call:
#lm(formula = mpg ~ disp, data = mtcars)
#
#Coefficients:
#(Intercept)         disp  
#   29.59985     -0.04122  

或者在“一”之前明确命名参数:

mtcars |> lm(formula = mpg ~ disp)

如果占位符被多次使用或用作任何位置上的命名或未命名参数或用于禁用的函数:使用(匿名)function.

mtcars |> (\(.) .[.$cyl == 6,])()
#mtcars ->.; .[.$cyl == 6,]           # Alternative using bizarro pipe
#local(mtcars ->.; .[.$cyl == 6,])    # Without overwriting and keeping .
#                mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4      21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#Mazda RX4 Wag  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#Valiant        18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#Merc 280       19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#Merc 280C      17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6

mtcars |> (\(.) lm(mpg ~ disp, .))()
#Call:
#lm(formula = mpg ~ disp, data = .)
#
#Coefficients:
#(Intercept)         disp  
#   29.59985     -0.04122

1:3 |> setNames(object = _, nm = _)
#Error in setNames(object = "_", nm = "_") : 
#  pipe placeholder may only appear once
1:3 |> (\(.) setNames(., .))()
#1 2 3 
#1 2 3

1:3 |> list() |> setNames(".") |> with(setNames(., .))
#1 2 3 
#1 2 3 

#The same but over a function
._ <- \(data, expr, ...) {
  eval(substitute(expr), list(. = data), enclos = parent.frame())
}
1:3 |> ._(setNames(., .))
#1 2 3 
#1 2 3 

一些功能是disabled https://github.com/wch/r-source/blob/e3b297a64f932d402dc59727c088386cae6a8112/src/main/names.c#L1007.

1:3 |> `+`(4)
#Error: function '+' not supported in RHS call of a pipe

但有些仍然可以通过将它们放在圆括号中来调用,通过函数调用它们::,在函数中调用它或定义到该函数的链接。

1:3 |> (`+`)(4)
#[1] 5 6 7

1:3 |> base::`+`(4)
#[1] 5 6 7

1:3 |> (\(.) . + 4)()
#[1] 5 6 7

fun <- `+`
1:3 |> fun(4)
#[1] 5 6 7

表达式写为x |> f(y)被解析为f(x, y)。虽然管道中的代码是按顺序编写的,但仍适用用于评估的常规 R 语义。所以管道表达式将是仅在首次使用时评估 in the rhs表达。

-1 |> sqrt() |> (\(x) 0)()
#[1] 0

. <- -1
. <- sqrt(.)
#Warning message:
#In sqrt(.) : NaNs produced
(\(x) 0)(.)
#[1] 0


x <- data.frame(a=0)
f1 <- \(x) {message("IN 1"); x$b <- 1; message("OUT 1"); x}
f2 <- \(x) {message("IN 2"); x$c <- 2; message("OUT 2"); x}

x|> f1() |> f2()
#IN 2
#IN 1
#OUT 1
#OUT 2
#  a b c
#1 0 1 2

f2(f1(x))
#IN 2
#IN 1
#OUT 1
#OUT 2
#  a b c
#1 0 1 2

. <- x
. <- f1(.)
#IN 1
#OUT 1
f2(.)
#IN 2
#OUT 2
#  a b c
#1 0 1 2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何纯粹在基础R(“基础管道”)中进行管道传输? 的相关文章

  • 将列表中的每个元素转换为数据框中的一列

    假设我有以下列表 d library combinat d permn c a b c 这看起来如下 1 1 a b c 2 1 a c b 3 1 c a b 4 1 c b a 5 1 b c a 6 1 b a c 是否可以将此列表的
  • 多个动态滤镜更新闪亮

    我希望能够让 UI 输入闪亮 并根据用户之前的选择进行自我更新 因此 在下面的示例中 预期的行为是用户选择cyl vsor carb那么这将 过滤数据集mtcars用于创建绘图 即用户根据过滤条件调整绘图并 更新其他过滤器中的剩余输入选择
  • 行对名称中具有特定模式的列求和

    我有一个像这样的数据表 DT lt ata table data table ref rep 3L 4L nb 12 15 i1 c 3 1e 05 0 044495 0 82244 0 322291 i2 c 0 000183 0 155
  • sapply - 保留列名称

    我试图总结数据集中许多不同列 变量 的平均值 标准差等 我已经编写了自己的汇总函数 以准确返回我需要和正在使用的内容sapply立即将此函数应用于所有变量 它工作正常 但是返回的数据帧没有列名 我似乎甚至无法使用列号引用重命名它们 也就是说
  • 闪亮的应用程序包:css 和所有 www/ 目录内容

    我正在尝试将 Shiny 应用程序转换为 R 包 但我在处理有关 www 目录以及 松散 文件的所有问题时遇到了问题 我闪亮的应用程序运行得很好 但是当我尝试 打包它 时 它不起作用 我闪亮的应用程序目录 my shiny app R ut
  • R - 重塑 - 熔化错误

    我正在尝试融化数据框 但出现了这个奇怪的错误 有什么想法吗 str zx7 data frame 519 obs of 5 variables calday new Date format 2011 01 03 2011 01 04 201
  • 从 data.frame 在 ggplot 图例中添加信息

    我想在图例中添加信息 哪个传感器具有该值 这是我的代码 z lt data frame a c sensor 1 sensor 2 sensor 3 sensor 4 sensor 5 sensor 6 sensor 7 sensor 8
  • 在 Shiny 中显示反应式 htmlTable 表格

    我正在制作我的第一个 Shiny 应用程序 但找不到任何有关如何显示使用 htmlTable 包创建的表格的示例 我基本上想在按下按钮时创建一个表格并显示它 Shiny 显示 html 代码而不是表格 我不知道用什么替换服务器部分中的 re
  • R在Windows平台Rstudio上打印data.frames中的UTF-8代码

    当数据框中存在UTF 8字符时 将无法正常显示 例如 以下内容是正确的 gt U6731 1 朱 但是当我将其放入数据框中并打印出来时 它是 gt data frame x U6731 x 1
  • dplyr:连接中的 NSE (by)

    我很难弄清楚如何使用 dplyr left join 和 NSE 连接两个表 问题是我无法为 by 提供正确的值 我想我现在已经找到了解决方案 但感觉我正在以一种额外复杂的方式来做 因此 如果您知道更简单 更优雅的解决方案 请告诉我 这就是
  • 要在子集中显示的非数字条目的维恩图

    我有以下数据框 SET1 SET2 SET3 par1 par2 par1 par2 par3 par2 par3 par4 par5 我想制作一个维恩图 其中所有这些 parX 元素都显示在各自的子集中 即作为标签 而不仅仅是重叠元素的数
  • case_when 与部分字符串匹配和 contains()

    我正在使用一个数据集 其中有许多名为 status1 status2 等的列 在这些列中 它表示某人是否豁免 完整 注册等 不幸的是 豁免投入并不一致 这是一个示例 library dplyr problem lt tibble perso
  • 使用数据帧的 R 中的 EWMA 波动性

    我正在尝试从一系列股票每日收益中获取 EWMA 波动性 这些收益来自一个名为base retorno diario Data IBOV ABEV3 AEDU3 ALLL3 BBAS3 BBDC3 BBDC4 1 2000 01 04 0 0
  • rvest 函数 html_nodes 返回 {xml_nodeset (0)}

    我正在尝试抓取以下网站的数据框 http stats nba com game 0041700404 playbyplay http stats nba com game 0041700404 playbyplay 我想创建一个表格 其中包
  • 自定义轴缩放后 ggplot2 缺少标签

    我正在尝试使用我的 x 轴应用自定义缩放ggplot2 and scales trans new 但是 当我这样做时 一些轴标签丢失了 有人可以帮我弄清楚为什么吗 Setup library tidyverse the data ds lt
  • 无法将“gather”输出的列名称更改为默认名称以外的任何名称

    我正在尝试使用gather in the tidyr包 但我无法更改默认名称的输出列名称 例如 df data frame time 1 100 a 1 100 b 101 200 df long df gt gather foo bar
  • 更改 R 中 ggplot geom_polygon 的颜色方案

    我正在使用地图库和 ggplot 的 geom polygon 创建地图 我只是想将默认的蓝色 红色 紫色配色方案更改为其他颜色 我对 ggplot 非常陌生 所以如果我没有使用正确的数据类型 请原谅 我使用的数据如下所示 gt head
  • 条件和分组 mutate dplyr

    假设我有以下每个抽屉库存增加的数据 gt socks year drawer nbr sock total 1990 1 2 1991 1 2 1990 2 3 1991 2 4 1990 3 2 1991 3 1 我想要一个二进制变量来标
  • 如何在R中分离两个图?

    每当我运行这段代码时 第一个图就会简单地覆盖前一个图 R中有没有办法分开得到两个图 plot pc title main abc xlab xx ylab yy plot pcs title main sdf xlab sdf ylab x
  • 更改ggplot2中的字体

    曾几何时 我改变了我的ggplot2字体使用windowsFonts Times windowsFont TT Times New Roman 现在 我无法摆脱这一切 在尝试设置family in ggplot2 theme 当我用不同的字

随机推荐

  • 启动ejb bean不工作

    我正在尝试使用启动 ejb 在启动时做一些事情 但我的豆子从来没有被调用过 这是我的豆子 import javax annotation PostConstruct import javax ejb Startup import javax
  • Django cookies 在电子邮件地址周围放置双引号

    在我的登录脚本中 它为用户登录其电子邮件地址和密码创建一个 cookie 我遇到的问题是 当设置电子邮件地址时 它将整个电子邮件地址放在双引号之间 我怎样才能让它不呢 if request method POST post request
  • iOS9 self.canDisplayBannerAds = true 不显示任何广告 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 非常简单的iAd代码 import UIKit import iAd class ViewController UIViewCon
  • Linux 上的 SAFEARRAY

    我在 Linux 上使用一个专有库 它使用SAFEARRAY输入回调函数 HRESULT Write SAFEARRAY Data SAFEARRAY在头文件中定义为typedef void SAFEARRAY 我必须定义一个回调函数来获取
  • ASP.NET MVC Html.Editor 将模型传递给编辑器模板

    我有一个名为 Address cshtml 的编辑器模板 其模型定义为 model Acme Models Address 在视图中 我想调用编辑器模板并传递相同类型的局部变量 并定义它将用于变量的名称 我尝试了很多方法 包括 Html E
  • 如何在Windows 10上构建winium驱动服务?

    我正在使用以下类代码通过 WiniumDriver 启动计算器 在创建 WiniumDriver 实例之前 我将启动一个 winium 驱动程序服务 import java io File import java io IOExceptio
  • java中的返回值语法

    我不太确定这个方法的作用 或者更好的是我不确定 是什么意思 有人可以帮我理解吗 private int guess return isTrue A isFalse B neither C D 这是嵌套的情况三元运算符 http en wik
  • SQL查询获取最近3个月的数据

    如何获取今天的日期并将其转换为01 mm yyyy格式化并从表中获取 3 个月前交货月份的数据 表已包含交割月份01 mm yyyy SELECT FROM TABLE NAME WHERE Date Column gt DATEADD M
  • 使用 jQuery 获取整个开始标签

    假设 HTML 是 div class someclass more divs div 如何使用 ID 获取 HTML 中显示的整个开始标记及其属性 但不是结束标记 例如 page tag 然后会返回 div class someclass
  • Apache Airflow 任务超时

    所以我有一个任务的测试 dag 这是一个简单的 ETL 尝试从 mssql 数据库中提取数据并将它们加载到 postgres 数据库 所以它的工作方式是按日期选择并插入过去 360 天的 postgres 数据库 但任务在 10 天左右后
  • 如何在Python中找到两个单词之间的最短依赖路径?

    我尝试在给定的依赖树中找到 Python 中两个单词之间的依赖路径 对于句子 流行文化中的机器人提醒我们人类的伟大之处 不受约束的人类机构 我使用了 practnlptools https github com biplab iitb pr
  • Scikit - SVM 的 3D 特征数组

    我正在尝试在 scikit 中训练 SVM 我正在遵循该示例并尝试将其调整为我的 3d 特征向量 我尝试了页面中的示例http scikit learn org stable modules svm html http scikit lea
  • org.apache.poi.POIXMLException 目前不支持严格的 OOXML,请参阅 bug #57699

    我想用java解析Excel文件 所以我使用apache poi库 这里是maven依赖项
  • 涂抹工具的算法?

    我正在尝试实现一个涂抹工具 就像您在 Gimp 或 Photoshop 中找到的那样 我尝试了很多变体 但它们都有问题 我尝试在图像上从位置 P1 到 P2 进行涂抹的基本方法是 从 P1 中复制当前画笔大小的矩形 在 P2 处以低不透明度
  • Django 管理站点:防止字段被编辑?

    是否可以防止某些字段在保存后被编辑 当用户创建特定模型的新项目时 它们应该是可编辑的 但当他们尝试打开它们来编辑某些字段时 它们会被 阻止 thanks 您可以覆盖您的 ModelAdminget readonly fields将某些字段设
  • sql:像任何一样与像所有一样

    我不明白为什么有时 LIKE 需要 ANY 有时却需要 ALL 这让我抓狂 我觉得我应该能够在这两种情况下使用 ANY 我试图选择括号中任何正则表达式后面的记录 出于某种原因 第一个 LIKE 与 ANY 一起工作得很好 它返回所有包含狗粮
  • UITextView 中带有
    标签的 HTML

    我想显示 HTML 文本 blockquote 中的标签UITextView HTML 示例 div blockquote class uncited div div blockquote div blockquote
  • Android:当相机设备打开完成时,如何在CameraX中获取回调?

    我想在cameraX完成打开时应用白平衡和曝光值 有没有办法让相机打开回调与CameraDevice StateCallback在相机2中 我不知道相机可用性的回调 但有一个用于预览的回调 预览可见性的回调 Use previewView
  • 使用 CUDA 和 OpenCV 在灰度 jpg 图像上应用 Sobel 边缘检测

    这个问题以前已经被问过 但是提问者没有提供足够的信息并且没有得到回答 我对该程序很好奇 原问题链接 https stackoverflow com questions 11091274 sobel filter in x direction
  • 如何纯粹在基础R(“基础管道”)中进行管道传输?

    有没有一种方法可以在基本 R 中进行管道传输 而无需定义自己的函数 即 开箱即用 的函数 并且无需加载任何外部包 也就是说 magrittr 管道的一些 基础 R 替代品 gt 可能在即将发布的 R 版本中 R 4 0 3 中提供此功能吗