R语言去除空白字符方法及班级成绩判断函数编写问题
R语言相关问题解答
1. R中去除空白字符的方法
- 去除首尾空白:使用基础包自带的
trimws()函数,支持指定去除位置:# 默认去除首尾所有空白(空格、制表符、换行符等) trimws(" 测试 字符串 \n") # 仅去除左侧空白 trimws(" 测试 字符串 ", which = "left") # 仅去除右侧空白 trimws(" 测试 字符串 ", which = "right") - 去除字符串内所有空白(包括中间空格):使用
gsub()配合正则替换:gsub("\\s", "", " 测 试 字 符 串 ") # 输出为"测试字符串"
2. 自定义函数错误排查与修正
原代码问题分析
你的需求是对整个marks向量做全局判断,只要有一个元素≤90就返回"Needs Improvement",所有元素都>90才返回"Best Class",但原代码存在两个核心问题:
- 逻辑错误:你遍历了每个元素逐个判断,给每个元素单独赋值返回结果,最终返回的是和输入marks长度相同的向量,而非单个判断结果。
- 冗余操作:你调用的
trimws()完全不必要,你赋值的字符串本身没有多余空白,输出中看到的间隔是R打印向量时的默认分隔符,不属于字符串内容。
修正后的代码
推荐使用R的向量化操作all()实现,无需循环,代码更简洁高效:
classmark <- function(marks) { if (all(marks > 90)) { ans <- "Best Class" } else { ans <- "Needs Improvement" } return(ans) } # 测试用例 print(classmark(c(100,95,94,56))) print(classmark(c(100,95,94,96)))
运行结果
[1] "Needs Improvement" [1] "Best Class"
如果需要保留循环写法,可修改为如下版本:
classmark <- function(marks) { all_above_90 <- TRUE for (i in seq_along(marks)) { if (marks[i] <= 90) { all_above_90 <- FALSE break # 发现不符合条件的元素后直接终止循环,提高效率 } } ans <- ifelse(all_above_90, "Best Class", "Needs Improvement") return(ans) }
内容的提问来源于stack exchange,提问作者user11870372
相关产品推荐
相关产品推荐

