跳至主要內容

02-R 语言编程

AI悦创原创1v1R 语言一对一辅导数据分析一对一辅导数据分析一对一教学留学生辅导R留学生作业辅导1v1R 语言一对一辅导数据分析一对一辅导数据分析一对一教学留学生辅导R留学生作业辅导大约 24 分钟...约 7060 字

1. 决策

1.1 if 条件语句

在许多情况下,你需要根据条件做出决定。

为此,可以使用 if 语句。

例如:

x <- 24
if(x > 10){
    print( "x is greater than 10")
}

如你所见,if 关键字后面是括号中的条件和大括号中的代码块,如果条件为 TRUE,则执行该代码块。

如果 if 语句的条件为 FALSE,则大括号中的代码将不会运行。

【填空题】小测

将下面代码填空完整使得可以创建有效的 if 语句。

logged_in = TRUE
___ (logged_in == TRUE___{
    print("Welcome")
___

1.2 else 语句

如果需要在 if 语句的条件为 FALSE 时运行代码,可以使用 else 语句:

x <- 42
if(x >= 100){
    print( "x is big")
} else {
    print( "x is less than 100")
}

1.3 else if 语句

如果需要多个检查,可以使用多个 else if 语句。

例如,让我们输出给定数字的英文版本:

num <- 3
if(num == 1){
    print("one")
} else if (num == 2){
    print("Two")
} else if (num == 3){
    print("Three")
} else {
    print("Something else")
}

【单选题】小测

下面这段代码的输出是什么?

x <- 7
if(x == 0) {
    print("Zero")
} else if(x %% 2 == 0) {
    print("Even")
} else {
    print("Odd")
}

2. 逻辑运算符

在 R 语言中,逻辑运算符用于比较值和表达式。以下是 R 语言中常用的逻辑运算符:

  • &:逻辑与(AND)运算符,如果两个值都为 TRUE,则返回 TRUE。
  • |:逻辑或(OR)运算符,如果至少一个值为 TRUE,则返回 TRUE。
  • !:逻辑非(NOT)运算符,对逻辑值取反。
  • &&:短路逻辑与(AND)运算符,仅当第一个值为 TRUE 时才检查第二个值。
  • ||:短路逻辑或(OR)运算符,仅当第一个值为 FALSE 时才检查第二个值。
  • ==:等于运算符,如果两个值相等,则返回 TRUE。
  • !=:不等于运算符,如果两个值不相等,则返回 TRUE。
  • <:小于运算符,如果左边的值小于右边的值,则返回 TRUE。
  • >:大于运算符,如果左边的值大于右边的值,则返回 TRUE。
  • <=:小于或等于运算符,如果左边的值小于或等于右边的值,则返回 TRUE。
  • >=:大于或等于运算符,如果左边的值大于或等于右边的值,则返回 TRUE。

这些运算符常用于条件判断和控制流语句中。例如:

# 使用 & 运算符
x <- 6
y <- 10
result <- (x > 5) & (y == 10)  # result 为 TRUE

# 使用 | 运算符
result <- (x < 5) | (y == 10)  # result 为 TRUE

# 使用 ! 运算符
result <- !(x < 5)  # result 为 TRUE

2.1 且运算符「AND」

&&&:与运算。如果两个操作数都为真,则条件为真。& 是向量化的,会对输入向量的每个元素进行运算,而 && 只会检查第一个元素。

2.1.1 &

逻辑运算符允许您组合多个条件。

逻辑 & (AND) 运算符允许你组合两个条件,并且仅当两个条件都为真时才返回真。

例如:

x <- 6
y <- 2
if(x > y & x < 10){
    print("Yes")
}

# ---output---
[1] "Yes"

2.1.2 &&

> TRUE & TRUE
[1] TRUE
> TRUE & FALSE
[1] FALSE
> "a" + 9  # 显然是会报错的
Error in "a" + 9 : non-numeric argument to binary operator
> TRUE & "a" + 9  # 第一个为 TRUE 则继续判断右边是否为真,故而报错
Error in "a" + 9 : non-numeric argument to binary operator
> FALSE & "a" + 9  # 第一个为 FALSE 理应不执行右边直接停止,但是从结果可以看出来,右边还是执行了
Error in "a" + 9 : non-numeric argument to binary operator
> TRUE && "a" + 9  # 如果用 && 的时候,第一个为 TRUE,那么第二个肯定报错,这个是正常的
Error in "a" + 9 : non-numeric argument to binary operator
> FALSE && "a" + 9  # 第一个是 FALSE,那么没有报错,表明进行了优化「截断」
[1] FALSE

2.2 或运算符「OR」

|||:或运算。如果两个操作数中有任意一个为真,则条件为真。| 是向量化的,会对输入向量的每个元素进行运算,而 || 只会检查第一个元素。

2.2.1 |

类似地,如果逻辑 |(OR) 运算符的任何一个条件为 TRUE,则该运算符返回 TRUE:

x <- 6
y <- 2
if(x > y | x > 100) {
    print("Yes")
}

# ---output---
[1] "Yes"

2.2.2 ||

> TRUE | TRUE
[1] TRUE
> TRUE | FALSE
[1] TRUE
> FALSE | TRUE
[1] TRUE
> FALSE | FALSE
[1] FALSE
> "A" + 9
Error in "A" + 9 : non-numeric argument to binary operator
> TRUE | "A" + 9
Error in "A" + 9 : non-numeric argument to binary operator
> FALSE | "A" + 9
Error in "A" + 9 : non-numeric argument to binary operator
> FALSE || "A" + 9
Error in "A" + 9 : non-numeric argument to binary operator
> TRUE || "A" + 9
[1] TRUE

2.3 非运算符「NOT」

!:非运算。用于反转操作数的逻辑状态。如果条件为真,则逻辑非运算符将使其为假。

> !TRUE
[1] FALSE
> !FALSE
[1] TRUE
> !!FALSE
[1] FALSE
> !!!FALSE
[1] TRUE

2.4 异或运算符「XOR」

xor(x, y):异或运算。如果 xy 中只有一个为真,结果为真。

# 使用 xor 函数
result1 <- xor(TRUE, FALSE)  # result1 为 TRUE
result2 <- xor(TRUE, TRUE)   # result2 为 FALSE
result3 <- xor(FALSE, FALSE) # result3 为 FALSE

【单选题】小测

在下面这个代码中的结果是什么?

(((15 > 4) & (8 < 9)) | (4 > 6))

3. switch 语句

switch 是一种分支结构,它根据表达式的值选择执行不同的代码块。它类似于其他编程语言中的 switchcase 语句,但有一些差异。

R 中的 switch 语句的基本语法是:

switch(EXPR, ...)

这里 EXPR 是一个返回字符字符串的表达式,后面跟着的是一系列的选项,这些选项可以是值或是执行的表达式。R会将 EXPR 的值与后面的选项名匹配,并执行匹配的代码块。

以下是 switch 语句的一个简单示例:

x <- 3
result <- switch(x,
                 "1" = "one",
                 "2" = "two",
                 "3" = "three",
                 "No match"
)
print(result)  # 打印 "three"

在这个例子中,变量 x 的值是 3,所以 switch 返回与索引 3 匹配的值 "three"。

3.1 字符串匹配

提供要比较的值和匹配时返回的值:

x <- "c"
result <- switch(
    x,
    "a" = "one",
    "b" ="Two",
    "c" = "Three",
    "d" = "Four"
)
print(result)

不管有几个元素,记住用逗号把它们分开。

3.2 匹配规则

  • 如果 EXPR 是一个数字,那么 switch 会选择它的第 EXPR 个参数。

  • 如果 EXPR 是一个字符串,那么 switch 会选择与之匹配的标签参数。

如果没有任何匹配项,而你提供了一个没有名称的额外参数,如上例中的 "No match",switch 将返回这个额外参数。如果没有提供这样的参数,switch 将不执行任何操作并返回 NULL

注意

需要注意的是,R 语言的 switch 语句与 C 语言或 Java 中的 switch 有所不同,因为 R 语言中的 switch 只执行一个匹配的分支,而不需要像其他语言中的 break 语句来防止执行下一个分支。此外,R 的 switch 只能对单个表达式的结果进行匹配检查,而不是对多个可能的表达式值。

3.3 索引匹配

还记得我们编写代码输出给定数字的英文版本吗?它使用多个 else-if 语句来检查数字。

R 提供了一个 switch 语句来根据值列表测试表达式,与使用 else-if 语句相比,它使代码更短。

例如:

num <- 4
result <- switch(
    num,       # 这是索引值
    "one",     # 索引 1
    "Two",     # 索引 2
    "Three ",  # 索引 3
    "Four"     # 索引 4
)
print(result)

switch 语句获取其第一个参数并返回其索引对应于该数字的值。

由于 num 的值是 4,switch 选择第四个参数,因此返回 "Four"。

这种基于索引的选择使得 switch 在 R 中的行为与其他编程语言中的 caseswitch 语句有所不同,后者基于匹配 case 标签来选择执行路径。在 R 中,当 switch 的表达式计算为数字时,它简单地选择参数列表中相应位置的元素。如果 num 的值超出了参数的数量,switch 将返回 NULL

【单选题】小测

下面这串代码的输出是什么?

x <- 2
choice <- switch(
    x,
    "Coffee",
    "Tea",
    "Water"
)

4. 循环

有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。

编程语言提供了更为复杂执行路径的多种控制结构。

循环语句允许我们多次执行一个语句或语句组。

R 语言提供的循环类型有:

  • repeat 循环
  • while 循环
  • for 循环

R 语言提供的循环控制语句有:

  • break 语句
  • Next 语句

循环控制语句改变你代码的执行顺序,通过它你可以实现代码的跳转。

4.1 repeat

repeat 循环会一直执行代码,直到条件语句为 true 时才退出循环,退出要使用到 break 语句。

在 R 语言中,repeat 是一个用于创建循环的关键词。这个循环会一直执行代码块,直到遇到 break 语句。repeat 循环不像 forwhile 循环那样有明确的循环条件,所以你必须在循环体内部提供一个退出循环的条件,通常是通过 if 语句和 break

语法格式如下:

repeat { 
    // 相关代码 
    if(condition) {
       break
    }
}

以下实例在变量 cnt 为 5 时退出循环,cnt 为计数变量:

v <- c("AIYC","Bornforthis")
cnt <- 2

repeat {
   print(v)
   cnt <- cnt+1
   
   if(cnt > 5) {
      break
   }
}

执行以上代码,输入结果为:

[1] "AIYC"        "Bornforthis"
[1] "AIYC"        "Bornforthis"
[1] "AIYC"        "Bornforthis"
[1] "AIYC"        "Bornforthis"

4.2 repeat practice

  1. 基础计数器:编写一个程序,使用 repeat 循环从1数到10,然后打印每个数字。
# 初始化计数器
counter <- 1

repeat {
    print(counter)
    counter <- counter + 1
    
    # 当计数器达到10时停止
    if (counter > 10) {
        break
    }
}
  1. 累加求和:使用 repeat 循环计算从1到100的累加和。
# 初始化累加器
sum <- 0
i <- 1

repeat {
    sum <- sum + i
    i <- i + 1
    
    # 当i大于100时停止循环
    if (i > 100) {
        break
    }
}

print(sum)
  1. 查找数组中的元素:给定一个数值数组和一个目标值,使用 repeat 循环查找目标值是否在数组中,并打印其位置或者一个表示未找到的信息。
# 示例数组和目标值
array <- c(2, 5, 8, 12, 16)
target <- 12

found <- FALSE
i <- 1

repeat {
    if (array[i] == target) {
        print(paste("Found at position:", i))
        found <- TRUE
        break
    }
    i <- i + 1
    
    if (i > length(array)) {
        break
    }
}

if (!found) {
    print("Not found")
}
  1. 生成斐波那契数列:使用 repeat 循环生成前20个斐波那契数列的数字。
fib <- numeric(20)
fib[1] <- 1
fib[2] <- 1

i <- 3

repeat {
    fib[i] <- fib[i - 1] + fib[i - 2]
    i <- i + 1
    
    if (i > 20) {
        break
    }
}

print(fib)

4.3 while 循环

只要给定的条件为 TRUE,R 语言中的 while 循环语句会重复执行一个目标语句。

while 循环具有以下语法:

while (condition) {
    statement(s);
} 

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。

condition 可以是任意的表达式,当为任意非零值时都为 TRUE。当条件为 TRUE 时执行循环。 当条件为 FALSE 时,退出循环,程序流将继续执行紧接着循环的下一条语句。

以下实例在在变量 cnt 小于 7 时输出 while 语句块中的内容,cnt 为计数变量:

v <- c("Bornforthis.cn","Google")
cnt <- 2

while (cnt < 7) {
   print(v)
   cnt = cnt + 1
}

# 输出:
[1] "Bornforthis.cn" "Google"        
[1] "Bornforthis.cn" "Google"        
[1] "Bornforthis.cn" "Google"        
[1] "Bornforthis.cn" "Google"        
[1] "Bornforthis.cn" "Google" 

让我们用它来输出数字 1 到 9:

i <- 1
while (i < 10){
    print(i)
    i <- i + 1
}

效果演示:

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9

上面的代码检查 i 是否小于 10,输出其值,然后将其递增 1。

这意味着循环将输出数字 1 到 9,并在达到值 10 时停止。

每次计算机运行一个循环时,它被称为一次迭代。

在 while 循环的迭代过程中更改条件的值非常重要,因为不这样做将导致无限循环,因为条件始终保持为真(TRUE)。

4.4 while 注意事项

  • 无限循环: 如果循环条件永远为真,while 循环将无限进行。要避免这种情况,请确保循环的某个部分能够改变条件,使其最终变为 FALSE
  • 循环控制: 可以使用 break 语句提前退出循环,或使用 next 语句跳过当前迭代的剩余部分。
  • 性能考虑: 对于大数据集或复杂的条件,while 循环可能导致性能问题。在这种情况下,可能需要考虑其他循环结构或向量化操作。

while 循环在数据分析和统计建模等任务中非常有用,它允许你在满足特定条件之前,对数据集执行重复操作。

4.5 while practice

  1. 使用 while 循环检查从 20 到 1 的每个数字是否是偶数或奇数,并相应地打印消息。

示例输出:

[1] "20 is even"
[1] "19 is odd"
[1] "18 is even"
[1] "17 is odd"
[1] "16 is even"
[1] "15 is odd"
[1] "14 is even"
[1] "13 is odd"
[1] "12 is even"
[1] "11 is odd"
[1] "10 is even"
[1] "9 is odd"
[1] "8 is even"
[1] "7 is odd"
[1] "6 is even"
[1] "5 is odd"
[1] "4 is even"
[1] "3 is odd"
[1] "2 is even"
[1] "1 is odd"
Answer
num <- 20
while (num > 0) {
  if (num %% 2 == 0) {
    print(paste(num, "is even"))
  } else {
    print(paste(num, "is odd"))
  }
  num <- num - 1
}
  1. 数字游戏:

    编写一个程序,生成一个 1 到 100 之间的随机数。然后使用 while 循环,让用户猜这个数字,如果猜对了,告诉用户猜对了并结束循环;如果猜错,根据数字是太大还是太小给出提示。

Answer
set.seed(123)  # 设置随机数种子
target <- sample(1:100, 1)
while (TRUE) {
  guess <- as.integer(readline(prompt = "Guess a number (1-100): "))
  if (guess == target) {
    print("Correct! You guessed the number.")
    break
  } else if (guess < target) {
    print("Too low. Try again.")
  } else {
    print("Too high. Try again.")
  }
}

4.6 For 循环

R 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。

它用于对给定序列进行迭代。

语法格式如下:

for (value in vector) {
    statements
}

R 语言的 for 循环特别灵活,不仅可以循环整数变量,还可以对字符向量,逻辑向量,列表等数据类型进行迭代。

以下实例输出 26 个字母对前面四个字母:

v <- LETTERS[1:4]
for ( i in v) {
   print(i)
}

执行以上代码,输入结果为:

[1] "A"
[1] "B"
[1] "C"
[1] "D"

例如输出 1:10 之间的数字:

for (x in 1:10){
    print(x)
}

效果如下所示:

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

R 允许我们通过使用冒号并指定上下限来创建数字序列。上述代码中的顺序将包括数字 1 到 10。

for 循环的每次迭代中,x 变量将取序列中下一个数字的值,因此,结果输出将是数字 1 到 10。

for 循环还用于迭代列表和向量。我们将在接下来的模块中了解它们。

【填空题】小测

将下面代码填充完整使得可以仅输出 1 到 100 顺序中的偶数。

如果除以 2,余数为 0,则数字为偶数。

___(x in 1 ___ 100) {
___ (x%%2 == 0) {
    print(___)
}
}

4.7 for practice

1. 字符直方图

编写一个程序,读取一串文本,然后使用 for 循环创建并打印每个字符出现次数的直方图。

Answer
text <- "example text"
char_freq <- table(strsplit(text, "")[[1]])

for (char in names(char_freq)) {
  cat(char, ":", rep("*", char_freq[char]), "\n")
}

# 输出示例
 : *
a: *
e: ***
l: *
m: *
p: *
t: **
x: **

2. 九九乘法表

Answer
for (i in 1:9) {
    for (j in 1:i) {
        cat(j, "x", i, "=", i*j, "\t")
    }
    cat("\n")
}


1x1= 1 
1x2= 2 2x2= 4 
1x3= 3 2x3= 6 3x3= 9 
1x4= 4 2x4= 8 3x4=12 4x4=16 
1x5= 5 2x5=10 3x5=15 4x5=20 5x5=25 
1x6= 6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 
1x7= 7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 
1x8= 8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 
1x9= 9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81 

4.8 break 与 next

4.7.1 break 语句

break 语句允许你停止循环。

R 语言的 break 语句插入在循环体中,用于退出当前循环或语句,并开始脚本执行紧接着的语句。

如果你使用循环嵌套,break 语句将停止最内层循环的执行,并开始执行的外层的循环语句。

break 也常用于 switch 语句中。

语法格式如下:

break

以下实例在变量 cnt 为 5 时使用 break 退出循环,cnt 为计数变量:

v <- c("Google","Bornforthis")
cnt <- 2

repeat {
   print(v)
   cnt <- cnt+1
   
   if(cnt > 5) {
      break
   }
}

执行以上代码,输入结果为:

[1] "Google"      "Bornforthis"
[1] "Google"      "Bornforthis"
[1] "Google"      "Bornforthis"
[1] "Google"      "Bornforthis"

再来看另外一个例子:

i <- 8
while(i > 0){
    print(i)
    i <- i - 1
    if(i == 4){
        break
    }
}

效果如下所示:

[1] 8
[1] 7
[1] 6
[1] 5

当上面的值达到 4 时,上面的代码将停止循环。

当需要从用户获取多个输入并在给定特定输入时停止时,这一点特别有用。

break 语句也可以与 for 循环一起使用。

【填空题】小测

下面这个代码将输出多少个数字?

i <- 1
while(i < 5) {
    print(i)
    i <- i + 1
    if(i == 3) {
        break
    }
}

下面将输出 _____ 个数字。

4.7.2 next 语句

next 语句允许你跳过一个迭代,并在下一个迭代中继续运行循环。

next 语句用于跳过当前循环,开始下一次循环(类似其他语言的 continue)。

语法格式如下:

next

以下实例输出 26 个字母的前面 6 个字母,在字母为 D 的时候跳过当前的循环,进行下一次循环:

v <- LETTERS[1:6]
for ( i in v) {
    if (i == "D") {  # D 不会输出,跳过这次循环,进入下一次
        next
    }
    print(i)
}

执行以上代码,输入结果为:

[1] "A"
[1] "B"
[1] "C"
[1] "E"
[1] "F"

再来看另一个代码例子。

例如,假设我们想要输出从 1 到 15 的所有数字,除了13:

for(x in 1:15) {
    if(x == 13){
        next
    }
    print(x)
}

效果截图如下所示:

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 14
[1] 15

请注意,我们在打印值之前检查下一条语句的条件。

break 语句类似,next 语句一样可以与 whilefor 循环一起使用。

【选词填空】小测

将下面代码填充完整使得可以输出从 1 到 50 的所有数字,数字 10 和 20 除外。

for(x __ 1:50) {
    if(x == 10 ___ x == 20) {
        _____
    }
    print(x)
}

in

|

next

5. 函数

函数是一组一起执行一个任务的语句。R 语言本身提供了很多的内置函数,当然我们也可以自己创建函数。

你可以把代码划分到不同的函数中。

如何划分代码到不同的函数中是由你来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

R 语言中函数是一个对象,可以拥有属性。

Other

函数(Function) 是可以使用其名称调用的代码块。

函数也可以将参数作为输入和返回值。

R 有许多内置函数。我们以前见过一些。

例如,print("Hello") 使用参数“Hello”调用函数 print。

参数被传递到括号内的函数中。

函数可以有多个参数,用逗号分隔。例如,max 函数可以接受多个参数并返回最大值:

res <-max(8, 3,12,88)
print(res)

函数可以在代码中多次调用,并采用不同的参数值。

5.1 定义函数

函数定义通常由以下几个部分组成:

  • 函数名: 为函数指定一个唯一的名称,以便在调用时使用。
  • 参数: 定义函数接受的输入值。参数是可选的,可以有多个。
  • 函数体: 包含实际执行的代码块,用大括号 {} 括起来。
  • 返回值: 指定函数的输出结果,使用关键字return

R 语言中的函数定义使用 function 关键字,一般形式如下:

function_name <- function(arg_1, arg_2, ...) {
    # 函数体
    # 执行的代码块
    return(output)
}

说明:

  • function_name : 为函数名
  • arg_1, arg_2, ... : 形式参数列表

函数返回值使用 return()

以下是一个简单的例子,展示如何定义和使用函数:

# 定义一个加法函数
add_numbers <- function(x, y) {
  result <- x + y
  return(result)
}

# 调用函数
sum_result <- add_numbers(3, 4)
print(sum_result)  # 输出 7

以上代码中,我们定义了一个名为 add_numbers 的函数,它接受两个参数 xy。函数体中的代码将这两个参数相加,并将结果存储在变量 result 中。最后,使用 return 关键字返回结果。

要调用函数,我们使用函数名后跟参数列表的形式,将参数的值传递给函数。在本例中,我们调用 add_numbers 函数,并传递参数 3 和 4。函数执行后,返回结果 7,我们将其存储在变量 sum_result 中,并打印输出。

Other

除了内置函数外,您还可以定义自己的函数并在代码中使用它们。

为此,我们需要使用 function 关键字并将其分配给一个名称。

例如:

pow<- function(x, y){
    result <- x^y
print(result)}
# 以下是调用的方法
pow(2,5)
pow(8,3)

该函数名为 pow,接受两个参数 xy,并将x的值提升为y的幂。

定义函数后,我们可以在代码中调用它:

pow(2,5)
pow(8,3)

函数可以接受任意数量的参数。记住用逗号分隔它们。

5.2 自定义函数

我们可以自己创建函数,用于特定到功能,定义后可以向内置函数一样使用它们。

下面演示两如何自定义函数:

# 定义一个函数,用于计数一个系列到平方值
new.function <- function(a) {
   for(i in 1:a) {
      b <- i^2
      print(b)
   }
}

接下来我们可以调用函数:

new.function <- function(a) {
    for(i in 1:a) {
       b <- i^2
       print(b)
    }
 }
 
# 调用函数,并传递参数
new.function(6)

执行以上代码,输出结果为:

[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
[1] 36

我们也可以创建一个不带参数的函数:

new.function <- function() {
    for(i in 1:5) {
        print(i^2)
    }
}      
 
# 调用函数,不需要传递参数
new.function()

执行以上代码,输出结果为:

[1] 1
[1] 4
[1] 9
[1] 16
[1] 25

【填空题】小测

将代码填充完整使得可以创建一个名为“square”的函数,该函数接受一个参数并输出其平方。

___ ___ ___ (x) {
    print(x^2)
}

5.3 带有参数值的函数

函数参数,可以按函数创建时的顺序来传递,也可以不按顺序,但需要指定参数名:

# 创建函数
new.function <- function(a,b,c) {
   result <- a * b + c
   print(result)
}

# 不带参数名
new.function(5,3,11)

# 带参数名
new.function(a = 11, b = 5, c = 3)

执行以上代码,输出结果为:

[1] 26
[1] 58

5.4 默认参数值

调用函数时,需要为其所有参数提供值。

  1. 通过指定默认参数值,可以仅使用函数的一部分参数调用函数,而其他参数则使用提供的默认值。

  2. 函数创建时也可以为参数指定默认值,如果调用的时候不传递参数就会使用默认值:

# 创建带默认参数的函数
new.function <- function(a = 3, b = 6) {
   result <- a * b
   print(result)
}

# 调用函数,但不传递参数,会使用默认的
new.function()

# 调用函数,传递参数
new.function(9,5)
Other

例如:

详情

R语言中的逻辑运算符主要包括以下几种:

  1. &&&:与运算。如果两个操作数都为真,则条件为真。& 是向量化的,会对输入向量的每个元素进行运算,而 && 只会检查第一个元素。

  2. |||:或运算。如果两个操作数中有任意一个为真,则条件为真。| 是向量化的,会对输入向量的每个元素进行运算,而 || 只会检查第一个元素。

  3. !:非运算。用于反转操作数的逻辑状态。如果条件为真,则逻辑非运算符将使其为假。

  4. xor(x, y):异或运算。如果 xy 中只有一个为真,结果为真。

这些运算符通常用于条件语句和循环中的逻辑判断。例如:

# 创建两个逻辑向量
x <- c(TRUE, FALSE, TRUE, FALSE)
y <- c(TRUE, TRUE, FALSE, FALSE)

# 与运算
print(x & y)  # 输出:TRUE FALSE FALSE FALSE

# 或运算
print(x | y)  # 输出:TRUE TRUE TRUE FALSE

# 非运算
print(!x)     # 输出:FALSE TRUE FALSE TRUE

# 异或运算
print(xor(x, y))  # 输出:FALSE TRUE TRUE FALSE

请注意,逻辑运算符返回的结果也是逻辑值,可以是 TRUE(真)、FALSE(假)或 NA(缺失值)。

当然,以下是使用R语言逻辑运算符的一些示例:

  1. &&& 的使用示例:
# 创建两个逻辑向量
x <- c(TRUE, FALSE, TRUE, FALSE)
y <- c(TRUE, TRUE, FALSE, FALSE)

# 使用 '&' 运算符
result <- x & y
print(result)  # 输出:TRUE FALSE FALSE FALSE

# 使用 '&&' 运算符
result <- x[1] && y[1]
print(result)  # 输出:TRUE
  1. ||| 的使用示例:
# 创建两个逻辑向量
x <- c(TRUE, FALSE, TRUE, FALSE)
y <- c(TRUE, TRUE, FALSE, FALSE)

# 使用 '|' 运算符
result <- x | y
print(result)  # 输出:TRUE TRUE TRUE FALSE

# 使用 '||' 运算符
result <- x[1] || y[1]
print(result)  # 输出:TRUE
  1. ! 的使用示例:
# 创建一个逻辑向量
x <- c(TRUE, FALSE, TRUE, FALSE)

# 使用 '!' 运算符
result <- !x
print(result)  # 输出:FALSE TRUE FALSE TRUE
  1. xor(x, y) 的使用示例:
# 创建两个逻辑向量
x <- c(TRUE, FALSE, TRUE, FALSE)
y <- c(TRUE, TRUE, FALSE, FALSE)

# 使用 'xor' 函数
result <- xor(x, y)
print(result)  # 输出:FALSE TRUE TRUE FALSE

以上代码均可以在R环境中运行。

在R语言中,c()函数是一个基本函数,用于创建向量或者将多个向量组合成一个。c实际上是combine的缩写,表示组合。

例如,你可以使用c()创建一个数值向量:

numbers <- c(1, 2, 3, 4, 5)
print(numbers)
# 输出:1 2 3 4 5

或者创建一个字符向量:

characters <- c("a", "b", "c", "d", "e")
print(characters)
# 输出:"a" "b" "c" "d" "e"

你也可以用它来合并向量:

numbers1 <- c(1, 2, 3)
numbers2 <- c(4, 5, 6)
combined <- c(numbers1, numbers2)
print(combined)
# 输出:1 2 3 4 5 6

所以,在我之前的示例中,c(TRUE, FALSE, TRUE, FALSE)是创建了一个逻辑向量。

欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!

公众号:AI悦创【二维码】

AI悦创·编程一对一

AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh

方法一:QQopen in new window

方法二:微信:Jiabcdefh

上次编辑于:
贡献者: AndersonHJB
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度