11.4 返回值

11.4.1 显式返回

函数返回的通常是最后一句代码的计算结果,可以显式利用return()提前返回。但是R for Data Science 中作者说: ‘我认为最好不要使用return()来表示,您可以使用更简单的解决方案尽早返回’

  • A common reason to do this is because the inputs are empty:
complicated_function <- function(x, y, z) {
  if (length(x) == 0 || length(y) == 0) {
    return(0)
  }
  # Complicated code here
}
  • Another reason is because you have a if statement with one complex block and one simple block. For example, you might write an if statement like this:
f <- function() {
  if (x) {
    # Do 
    # something
    # that
    # takes
    # many
    # lines
    # to
    # express
  } else {
    # return something short
  }
}

11.4.2 编写管道函数

管道函数有两种基本类型: transformations and side-effects。使用transformations时,会将对象传递到函数的第一个参数,然后返回修改后的对象。使用side-effects时,不会对传递的对象进行转换。相反,该函数对对象执行操作,例如绘制图或保存文件。副作用函数应该“无形地”返回第一个参数,以便在不打印它们时仍可以在管道中使用它们。例如,以下简单函数在数据框中打印缺失值的数量:

以上从 R for Data Science 中翻译得来。

show_missings <- function(df) {
  n <- sum(is.na(df))
  cat("Missing values: ", n, "\n", sep = "")
  
  invisible(df)
}

以交互invisible()方式调用它,则意味着输入df不会被打印出来:

show_missings(mtcars)
#> Missing values: 0

但是结果仍存在,默认情况下只是不打印显示出来:

x <- show_missings(mtcars) 
#> Missing values: 0
class(x)
#> [1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame"
dim(x)
#> [1] 32 11

在管道中继续使用

mtcars %>% 
  show_missings() %>% 
  mutate(mpg = ifelse(mpg < 20, NA, mpg)) %>% 
  show_missings() 
#> Missing values: 0
#> Missing values: 18