R中使用sapply()处理向量为何同时输出打印结果与返回向量?
问题分析:为何sapply运行后既逐行打印等级又返回结果向量?
我在R中编写了student_grade函数,用于将分数转换为对应等级,随后使用sapply()将该函数应用于自定义的grade向量。运行后控制台既逐行打印了每个分数的等级,又返回了一个包含所有等级的向量,请问为何会出现这种情况?
附代码
student_grade <- function(grade){ if (grade < 60) { print("F")} else { if (grade < 70 & grade > 60 ){ print("D")} else { if (grade < 80 & grade > 70){ print("C")} else { if (grade < 90 & grade > 80){ print("B")} else { print("A")}}}}} grade <- c(99,100,34,56,77,88,67,56,67,78,66,78,90,12,44) sapply(grade,student_grade)
运行输出
[1] "A" [1] "A" [1] "F" [1] "F" [1] "C" [1] "B" [1] "D" [1] "F" [1] "D" [1] "C" [1] "D" [1] "C" [1] "A" [1] "F" [1] "F" [1] "A" "A" "F" "F" "C" "B" "D" "F" "D" "C" "D" "C" "A" "F" "F"
原因解析
- 逐行打印的由来:你的函数里用了
print()函数,这个函数的核心作用就是直接向控制台输出内容。sapply会遍历grade向量的每个元素,每次调用student_grade时,print()都会触发一次控制台打印,这就是逐行输出等级的原因。 - 最终向量的由来:R语言中,函数默认会返回最后一行执行的表达式结果。而
print()函数在输出内容的同时,还会返回它打印的内容(比如print("A")执行后,除了打印"A",还会把"A"作为返回值传递出去)。sapply会收集每次调用函数的返回值,最后整合成一个向量返回,这就是最后一行完整向量的来源。 - 额外逻辑漏洞:你的函数没有覆盖60、70、80、90这些边界分数的情况。比如60分既不满足
grade < 60,也不满足grade > 60,会直接走到最后一个分支返回"A",这不符合等级规则。
修正方案
把函数里的print()替换为返回逻辑,同时修正条件覆盖边界值:
student_grade <- function(grade){ if (grade < 60) { "F" } else if (grade < 70) { # 自动包含60 ≤ grade < 70的情况 "D" } else if (grade < 80) { # 自动包含70 ≤ grade < 80的情况 "C" } else if (grade < 90) { # 自动包含80 ≤ grade < 90的情况 "B" } else { # 包含90及以上的情况 "A" } } grade <- c(99,100,34,56,77,88,67,56,67,78,66,78,90,12,44) sapply(grade, student_grade)
修改后运行代码,控制台只会返回最终的等级向量,不会再逐行打印每个等级,同时边界分数也能正确匹配对应的等级。
内容的提问来源于stack exchange,提问作者Obinna Dinneya
相关产品推荐
相关产品推荐

