11.4 返回值
11.4.1 显式返回
函数返回的通常是最后一句代码的计算结果,可以显式利用return()提前返回。但是R for Data Science 中作者说: ‘我认为最好不要使用return()来表示,您可以使用更简单的解决方案尽早返回’
- A common reason to do this is because the inputs are empty:
<- function(x, y, z) {
complicated_function 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:
<- function() {
f 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 中翻译得来。
<- function(df) {
show_missings <- sum(is.na(df))
n cat("Missing values: ", n, "\n", sep = "")
invisible(df)
}
以交互invisible()方式调用它,则意味着输入df不会被打印出来:
show_missings(mtcars)
#> Missing values: 0
但是结果仍存在,默认情况下只是不打印显示出来:
<- show_missings(mtcars)
x #> 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