# 自定义函数{#self:define-function}
函数功能使我们尽可能避免复制粘贴代码,而且需要更改的时候不需要大面积修改代码仅需要调整函数参数,使代码整体更加模块化.
假设有工作任务需要给商品SKU排名,在代码中需要重复以下代码5次,当区间需要修改的时候就是灾难.
原始代码示例如下:
```{r message=FALSE,warning=FALSE}
library(tidyverse)
num 200,"200以上",'其他')))))
# same above
# case_when(num <= 50 ~ '1-50',
# num <= 100 ~ '51-100',
# num <= 150 ~ '101-150',
# num <= 200 ~ '151-200',
# num > 100 ~ '200以上'
# )
# 个人倾向data.table
# data.table::fifelse()
# data.table::fcase() 是sql中case when的实现
```
函数化后代码示例如下:
当需要修改区间时候仅仅只需要调整参数,而不必大量修改代码,当在脚本中需要调用多次时,能简洁代码.
```{r }
cut_function % as.character()
}
res2 [1] "a, b, c, d, e, f, g, h, i, j"
rule %
show_missings() %>%
mutate(mpg = ifelse(mpg < 20, NA, mpg)) %>%
show_missings()
```
## 环境 {#function:environment}
环境是复杂的,建议阅读原文.
The last component of a function is its environment. This is not something you need to understand deeply when you first start writing functions. However, it’s important to know a little bit about environments because they are crucial to how functions work. The environment of a function controls how R finds the value associated with a name. For example, take this function:
```{r}
f
## 拓展部分{#function:expand}
在我之前工作中遇到需要分组计算时,我想要编写一个函数实现某些功能,但是分组的group_by()字段不一样时,导致代码没办法复用。
参考资料:
```{r eval=FALSE}
#library(tidyverse)
mean_mpg = function(data, group_col) {
data %>%
group_by(group_col) %>%
summarize(mean_mpg = mean(mpg))
}
mtcars %>% mean_mpg(cyl)
mtcars %>% mean_mpg(gear)
```
当编写如下函数时,代码将成功运行
```{r}
#自定义函数
my_summarise3 %
group_by({{ group_var }}) %>%
summarise(mean = mean({{ mean_var }}), sd = mean({{ sd_var }}))
}
res1 %
group_by(cyl) %>%
summarise(mean=mean(carb),sd=mean(gear))
identical(res1,res2)
#res1 和res2 结果完全一致
```
以上my_summarise3()函数可以按照需求任意指定聚合汇总字段。