-
Notifications
You must be signed in to change notification settings - Fork 220
/
baseR_functions_adv.Rmd
183 lines (127 loc) · 2.52 KB
/
baseR_functions_adv.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# 函数应用 {#baseR-functions-adv}
## 灵活的语法
我们对输入的向量每个元素计算平方,可以这样写函数
```{r}
mysquare <- function(x) {
y <- x^2
return(y)
}
```
R语言里面,完成一件事情往往有很多种方法,比如
方法1:
```{r}
mysquare <- function(x) {
return(x^2)
}
```
方法2:
```{r}
mysquare <- function(x) { return(x^2) }
```
方法3:
```{r}
mysquare <- function(x) return(x^2)
```
方法4:
```{r}
mysquare <- function(x) {
x^2
}
```
方法5:
```{r}
mysquare <- function(x) x^2
```
## 多个参数
```{r}
sum_two <- function(num1, num2) {
sum <- num1 + num2
return(sum)
}
sum_two(num1 = 1, num2 = 2)
sum_two(12, 9)
```
练习:说说这个函数的意思
```{r}
norm_by_y <- function(num1, num2) {
result <- (num1 - num2)/num2
return(result)
}
```
## 条件语句
使用 `if-else` 语句
```{r, eval=FALSE}
if(condition) {
Do something
} else {
Alternative something
}
```
比如,先判断是否为数值,如果是返回它的平方,如果不是数值,就返回提示语句
```{r}
square_if <- function(num) {
if (is.numeric(num)) {
num^2
} else {
"Your input is not numeric."
}
}
square_if("a")
square_if(3)
```
练习:将上面`sum_two()`函数增加数据类型判断语句,让函数更安全。
```{r, eval=FALSE}
sum_two("a", "b")
```
多个条件的,就需要`if-else if-else`语句,比如这里判断一个数是正数、负数还是0
```{r}
check_number <- function(x) {
if (x < 0) {
print("Negative number")
} else if (x > 0) {
print("Positive number")
} else {
print("Zero")
}
}
x <- 0
check_number(x)
```
## 返回多个结果
如果要返回多个统计结果,可以把结果先放在list或者data.frame中,然后再返回。
```{r}
mystat <- function(x){
meanval <- mean(x)
sdval <- sd(x)
list(sd = sdval, mean = meanval)
}
```
或者
```{r}
mystat <- function(x){
meanval <- mean(x)
sdval <- sd(x)
data.frame(
sd = sdval,
mean = meanval
)
}
```
## 更多
冰淇淋放大器,这个机器有很多档位,可以让冰淇淋放大指定的倍数,默认为10倍
```{r}
enlarge_icecream <- function(multi = 10) {
function(icecream) {
icecream * multi
}
}
```
等待被放大的冰淇淋的大小
```{r}
x <- c(2, 3, 4.5)
x
```
这个冰淇淋机器 `enlarge_icecream(multi = 100)()`有很多档位,可以指定放大的倍数,比如这里设定为100倍
```{r}
enlarge_icecream(multi = 100)(x)
```