避免在purrr映射调用中返回匿名函数中的最后一个求值表达式

时间:2018-07-03 16:42:43

标签: r anonymous-function purrr

考虑一下:

library(tidyverse)

mtcars %>%
  select(mpg, cyl) %>%
  map(
    function(x) {
      cat("*****HEAD******\n")
      print(head(x))
      cat("*****TAIL******\n")
      print(tail(x))
    }
  )

哪个返回:

*****HEAD******
[1] 21.0 21.0 22.8 21.4 18.7 18.1
*****TAIL******
[1] 26.0 30.4 15.8 19.7 15.0 21.4
*****HEAD******
[1] 6 6 4 6 8 6
*****TAIL******
[1] 4 4 8 6 8 4
$`mpg`
[1] 26.0 30.4 15.8 19.7 15.0 21.4

$cyl
[1] 4 4 8 6 8 4

如何避免返回最后一个求值表达式(即tail(x))?我想要的输出将是:

*****HEAD******
[1] 21.0 21.0 22.8 21.4 18.7 18.1
*****TAIL******
[1] 26.0 30.4 15.8 19.7 15.0 21.4
*****HEAD******
[1] 6 6 4 6 8 6
*****TAIL******
[1] 4 4 8 6 8 4

我尝试了return(NULL)return(NA)return(invisible(x)),但没有成功。

2 个答案:

答案 0 :(得分:2)

使用walk()代替map()

capture <- mtcars %>%
  select(mpg, cyl) %>%
  walk(
    function(x) {
      cat("*****HEAD******\n")
      print(head(x))
      cat("*****TAIL******\n")
      print(tail(x))
    }
  )
# *****HEAD******
#   [1] 21.0 21.0 22.8 21.4 18.7 18.1
# *****TAIL******
#   [1] 26.0 30.4 15.8 19.7 15.0 21.4
# *****HEAD******
#   [1] 6 6 4 6 8 6
# *****TAIL******
#   [1] 4 4 8 6 8 4

答案 1 :(得分:1)

只需将%>% invisible附加到管道的末尾即可。它仍然会返回相同的结果,但是会隐式地执行,因此输入它不会显示任何结果。

mtcars %>%
  select(mpg, cyl) %>%
  map(
    function(x) {
      cat("*****HEAD******\n")
      print(head(x))
      cat("*****TAIL******\n")
      print(tail(x))
    }
  ) %>% 
  invisible

给予:

*****HEAD******
[1] 21.0 21.0 22.8 21.4 18.7 18.1
*****TAIL******
[1] 26.0 30.4 15.8 19.7 15.0 21.4
*****HEAD******
[1] 6 6 4 6 8 6
*****TAIL******
[1] 4 4 8 6 8 4