如何让R语言自定义函数的输出结果按不同行单独打印?
解决方案
你当前的代码在处理环节将所有段落的处理结果合并成了单个字符串,因此返回的是长度为1的字符向量,无法实现逐行显示效果。只需将逐句处理的逻辑独立,保留每个句子的向量结构即可解决问题。
前置依赖
你用到了str_split函数,需要先加载stringr包:
install.packages("stringr") # 未安装时先执行 library(stringr)
修改后的完整代码
text_shortener <- function(input_text) { # 提取每段第一句话 first.sentences <- unlist(lapply(input_text, function(x) str_split(x, "\\.", simplify = T)[1])) # 去除多余空格 no.spaces <- gsub(pattern = "(?<=[\\s])\\s*|^\\s+|\\s+$", replacement = "", x = first.sentences, perl = TRUE) stopwords <- c("the", "really", "truly", "very", "The", "Really", "Truly", "Very") # 逐句处理:去停用词、单词截断,保留向量结构 final.text <- sapply(no.spaces, function(sent) { # 拆分当前句子的单词 words <- unlist(strsplit(sent, " ")) # 去停用词后拼接回句子 no_stop_sent <- paste(words[!words %in% stopwords], collapse = " ") # 单词超过5个字符的部分替换为. gsub(pattern = "(?<=\\w{5})\\w+", replacement = ".", x = no_stop_sent, perl=TRUE) }, USE.NAMES = FALSE) # 去掉默认生成的元素名 return(final.text) }
效果验证
运行测试后输出格式如下:
> text_shortener(Moby_Dick) [1] "Call me Ishma." [2] "It is a way I have of drivi. off splee., and regul. circu." [3] "This is my subst. for pisto. and ball"
如果不需要显示R默认的向量索引,只需要输出纯文本逐行,可以调用函数时用以下写法:
cat(paste(text_shortener(Moby_Dick), collapse = "\n"))
修改说明
- 删掉了无赋值操作的冗余
lapply语句 - 将原本全局合并处理的逻辑改为逐句循环处理,每个句子的处理结果独立保存为向量的一个元素
- 最终返回的字符向量长度等于输入文本的段落数,R打印向量时会自动逐行显示每个元素,符合你需要的格式要求
内容的提问来源于stack exchange,提问作者Megan Dougherty
相关产品推荐
相关产品推荐

