在管道末端运行函数

问题描述 投票:0回答:4

此代码从数据框中的两个不同列生成一个句子

library(dplyr); library(tibble); library(magrittr)

mtcars %>% 
  rownames_to_column(var = "car") %>%
  sample_n(5) -> 
  df

paste0(df$car, " (", df$mpg, ")", collapse = ", ")

# "Mazda RX4 Wag (21), Hornet Sportabout (18.7), Merc 280 (19.2), Dodge Challenger (15.5), Merc 450SLC (15.2)"

但不是让

paste0(df$car, " (", df$mpg, ")", collapse = ", ")
在独立线路上运行,我怎样才能让它在管道末端运行,如下所示(这会引发书面错误):

mtcars %>% 
  rownames_to_column(var = "car") %>%
  sample_n(5) %>%
  paste0(df$car, " (", df$mpg, ")", collapse = ", ")
r dataframe pipe tibble
4个回答
4
投票

with()
适用于此:

mtcars %>% 
  rownames_to_column(var = "car") %>%
  sample_n(5) %>% 
  with(paste0(car, " (", mpg, ")", collapse = ","))

另一种可能性是用以下方式结束管道:

... %>% 
   mutate(word = glue("{car} ({mpg})")) %>% 
   pull(word) %>% 
   paste0(collapse =", ")

1
投票

这里是基本 R 方法。

> set.seed(42)
> Map(\(x, y) sprintf('%s (%s)', x, y), rownames(mtcars), mtcars$mpg) |> 
+   sample(5) |> toString()
[1] "Chrysler Imperial (14.7), Hornet Sportabout (18.7), Mazda RX4 (21), Pontiac Firebird (19.2), Merc 280 (19.2)"

> set.seed(42)
> transform(mtcars, car=rownames(mtcars)) |> 
+   subset(car %in% sample(car, 5)) |> 
+   with(Map(\(x, y) sprintf('%s (%s)', x, y), car, mpg)) |> 
+   toString()
[1] "Mazda RX4 (21), Hornet Sportabout (18.7), Merc 280 (19.2), Chrysler Imperial (14.7), Pontiac Firebird (19.2)"

0
投票

另外两个类似于

with()
的解决方案:

大括号中的点表示法

library(dplyr)
library(tibble)

set.seed(42)

mtcars %>% 
  rownames_to_column(var = "car") %>%
  sample_n(5) %>% 
  { paste0(.$car, " (", .$mpg, ")", collapse = ", ") }
#> [1] "Chrysler Imperial (14.7), Hornet Sportabout (18.7), Mazda RX4 (21), Pontiac Firebird (19.2), Merc 280 (19.2)"

创建于 2024-04-17,使用 reprex v2.1.0

匿名函数

library(dplyr)
library(tibble)

set.seed(42)

mtcars %>% 
  rownames_to_column(var = "car") %>%
  sample_n(5) %>%
  {\(x) paste0(x$car, " (", x$mpg, ")", collapse = ", ")}()
#> [1] "Chrysler Imperial (14.7), Hornet Sportabout (18.7), Mazda RX4 (21), Pontiac Firebird (19.2), Merc 280 (19.2)"

创建于 2024-04-17,使用 reprex v2.1.0


0
投票

使用

magrittr
展览管
%$%
stringr::str_glue
的替代方案:

mtcars %>% 
  head() %>% 
  rownames_to_column(var = "car") %$%
  str_glue("{car} ({mpg})") %>% 
  str_flatten_comma()

输出:

[1] "Mazda RX4 (21), Mazda RX4 Wag (21), Datsun 710 (22.8), Hornet 4 Drive (21.4), Hornet Sportabout (18.7), Valiant (18.1)"
© www.soinside.com 2019 - 2024. All rights reserved.