如何在R中实现F#的前向管道运算符?操作员可以轻松地链接一系列计算.例如,当你有一个输入data,想调用函数foo和bar顺序,你可以这样写:
data |> foo |> bar
Run Code Online (Sandbox Code Playgroud)
而不是写作bar(foo(data)).好处是您可以避免使用某些括号,并且计算的执行顺序与执行顺序相同(从左到右).在F#中,运算符定义如下:
let (|>) a f = f a
Run Code Online (Sandbox Code Playgroud)
看起来%...%可以用于二元运算符,但是它如何工作?
我想编写一个自定义管道运算符,其中使用的运算符名称为 open。它可能是例如%>%, %|%, :=, ... 也许需要根据所需的运算符优先级进行选择,如相同函数中所述,但使用名称 %>% 会导致与使用名称 := 时相比不同的结果。
使用的占位符名称是开放的,但.或_很常见,需要显式放置(不会自动放置作为第一个参数)。
评估环境是开放的。但在这个答案中,看起来应该避免使用用户环境。
它应该能够在用户环境中保留该值,以防它与占位符同名。
1 %>% identity(.)
#[1] 1
.
#Error: object '.' not found
. <- 2
1 %>% identity(.)
#[1] 1
.
#[1] 2
Run Code Online (Sandbox Code Playgroud)
它应该能够更新用户环境中的值,包括占位符的名称。
1 %>% assign("x", .)
x
#[1] 1
"x" %>% assign(., 2)
x
#[1] 2
1 %>% assign(".", .) …Run Code Online (Sandbox Code Playgroud) 从 R-Version 4.1.0 开始,管道|>处于稳定版本。当将 lhs 传递给第一个参数以外的参数时,手册的示例显示:
mtcars |> subset(cyl == 4) |> (function(d) lm(mpg ~ disp, data = d))()
Run Code Online (Sandbox Code Playgroud)
或使用时 \(x)
mtcars |> subset(cyl == 4) |> (\(d) lm(mpg ~ disp, data = d))()
Run Code Online (Sandbox Code Playgroud)
或者使用当前需要激活的PIPEBIND:
Sys.setenv(`_R_USE_PIPEBIND_` = TRUE)
mtcars |> subset(cyl == 4) |> . => lm(mpg ~ disp, data = .)
Run Code Online (Sandbox Code Playgroud)
|>也可以使用Bizarro 管道 代替->.;
mtcars |> subset(cyl == 4) ->.; lm(mpg ~ disp, data = .)
Run Code Online (Sandbox Code Playgroud)
由于 R 中管道符号的一个目的是允许以一种可能使处理步骤序列 更容易遵循 …
有没有办法在基本 R 中进行管道传输,而无需定义自己的函数(即“开箱即用”的东西),也无需加载任何外部包?
也就是说,一些(基数 R)替代 magrittr pipe %>%。可能在即将推出的 R (?)
此功能在 R 4.0.3 中是否可用。如果不是,它是在哪个 R 版本中找到的,如果是,这是如何实现的?
lme4::lmer我目前正在尝试按照本教程绘制函数的结果。我已经尝试了教程中的代码,它按预期工作。\n在教程中,在pred_dist绘图之前将一列添加到数据集中以用于拟合函数。当我用自己的数据尝试此操作时,出现以下错误:
Error: Problem with `mutate()` column `pred_dist`.\n\xe2\x84\xb9 `pred_dist = fitted(model0)`.\n\xe2\x84\xb9 `pred_dist` must be size 15 or 1, not 17192.\n\xe2\x84\xb9 The error occurred in group 1: sgroup = 578, group = 1.\nRun Code Online (Sandbox Code Playgroud)\n\n我的代码:
\n# Loaded libraries\nlibrary(dplyr)\nlibrary(ggplot2)\nlibrary(lme4)\nlibrary(lmerTest)\nlibrary(lattice)\n\n# My lmer model. myData is fairly \nmodel0 <- lmer(outcome ~ (1|group), data=myData, REML = FALSE)\nsummary(model0)\n\nmyData %>% \n # save predicted values\n mutate(pred_dist = fitted(model0)) \nRun Code Online (Sandbox Code Playgroud)\n我想了解的是:是什么导致了此错误消息,以及如何解决它?
\n根据bouncyballungroup()的评论,我在之前添加了\n …
我意识到这个问题之前已经被问过,但没有点击。真的没有占位符吗?
例子:
my_mtcars <- mtcars %>% mutate(bla = c(1:nrow(.)))
my_mtcars$bla[10] <- NA
my_mtcars$bla[15] <- NA
Run Code Online (Sandbox Code Playgroud)
作品:
# magritr pipe to return NA rows while debugging a df
my_mtcars %>% filter(!complete.cases(.)) %>% glimpse
Run Code Online (Sandbox Code Playgroud)
不起作用:
# native piple equivilent
my_mtcars |> filter(!complete.cases(.)) |> glimpse()
Run Code Online (Sandbox Code Playgroud)
我尝试使用本机管道执行的操作的“正确”方法是什么?
这基本上与dplyr with %>% pipeline 中的链算术运算符相同的问题,但针对新的(如 R 4.1)管道运算符进行了更新|>。
如何将算术运算符与 R 本机管道链接起来|>?使用 dplyr/magrittr,您可以对算术运算符使用反引号,但这不适用于内置的 R 管道运算符。这是一个简单的例子:
R.version$version.string
# [1] "R version 4.2.2 (2022-10-31 ucrt)"
x <- 2
# With dplyr/magrittr, you can use backticks for arithmetic operators
x %>% `+`(2)
# [1] 4
# But that doesn't work with the inbuilt R pipe operator
x |> `+`(2)
# Error: function '+' not supported in RHS call of a pipe
Run Code Online (Sandbox Code Playgroud)
希望答案足够通用,适用于通常不能与本机 R 管道很好地配合的任何运算符或内置函数(我的版本是 R 4.2.2)。
答案/sf/answers/5046054471/有很多关于 …
我想知道在 dplyr 链存在条件元素的情况下如何使用基管|>代替 tidyverse 的基管。%>%当我尝试使用以下代码时|>,出现错误:
Error: function '{' not supported in RHS call of a pipe
Run Code Online (Sandbox Code Playgroud)
Tidyverse 示例
library(tidyverse)
condition = FALSE
mtcars %>%
{ if(condition == TRUE)
mutate(., mpg = mpg*1000)
else . }
Run Code Online (Sandbox Code Playgroud)
基本 R 管道示例(导致错误):
mtcars |>
{ if(condition == TRUE)
mutate(., mpg = mpg*1000)
else . }
Run Code Online (Sandbox Code Playgroud) 我正在使用@Konrad Rudolph的函数,但将其名称从 更改%>%为:=,并获得相同的调用不同的结果。
`%>%` = function (lhs, rhs) {
subst = call('substitute', substitute(rhs), list(. = lhs))
eval.parent(eval(subst))
}
`:=` <- `%>%`
1 %>% .+2 %>% .*3
#[1] 7
1 := .+2 := .*3
#[1] 3
Run Code Online (Sandbox Code Playgroud)
或者具有不同的功能。
`%>%` <- function(lhs, rhs) {
assign(".", lhs, envir=parent.frame())
eval(substitute(rhs), parent.frame())
}
`:=` <- `%>%`
1 %>% .+2 %>% .*3
#[1] 7
1 := .+2 := .*3
#[1] 9
Run Code Online (Sandbox Code Playgroud)
为什么使用名为 的函数时会得到其他结果:=?
由于我刚刚开始学习R,我想将下面的代码重新编写成管道运算符的方式。但是,设置 rowname 和 colname 阻止了我。如果有人能帮助我,我将不胜感激,非常感谢!
原代码详细如下,
data_3 <- c(692, 5, 0, 629, 44, 9)
table_3 <- matrix(data_3, ncol=3, byrow = TRUE)
colnames(table_3) <- c("Improved", "Hospitalized", "Death")
rownames(table_3) <- c("Treated", "Placebo")
table_3 <- as.table(table_3)
chisq.test(table_3)
fisher.test(table_3)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用管道运算符时,我在设置 colname 和 rowname 时遇到了麻烦。
c(692, 5, 0, 629, 44, 9) %>%
matrix(ncol = 3) %>%
colnames <- c("Improved", "Hospitalized", "Death")
Run Code Online (Sandbox Code Playgroud)
如果有人可以帮助我使用这个管道操作员,我将不胜感激。
非常感谢您的支持!
此致,
查尔斯
我想选择每个 的第一个V(列中)之后出现的行。actionuser
df<-read.table(text="
user action
1 D
1 D
1 P
1 E
1 V
1 D
1 D
2 E
2 V
2 V
2 P",header=T,stringsAsFactors = F)
resutl:
user action
1 V
1 D
1 D
2 V
2 V
2 P
Run Code Online (Sandbox Code Playgroud)