如何编写R函数实现提示输入.fasta文件名并完成文件读取?
R语言交互式读取fasta文件函数修复
原代码问题点
- 函数未定义名称,无法直接调用
- 输入参数
DNAseq无实际作用,和函数内部通过readline获取文件名的逻辑冲突 read.table为结构化表格专用读取函数,无法解析fasta格式的序列文件,会出现格式报错- 函数未设置返回值,读取到的内容无法传递到函数外部使用
修复后可运行代码
方案1:使用生物序列专用包Biostrings(推荐)
该方案是生物信息领域读取fasta文件的标准实现,支持后续直接做序列统计、比对等操作
# 首次使用需先安装依赖包,运行以下代码即可: # if (!require("BiocManager", quietly = TRUE)) install.packages("BiocManager") # BiocManager::install("Biostrings") read_fasta_interactive <- function() { # 提示用户输入fasta文件名 fasta_file <- readline(prompt = "请输入当前目录下的.fasta文件名:") # 校验文件是否存在 if (!file.exists(fasta_file)) { stop("未找到指定文件,请检查文件名拼写及路径是否正确") } # 读取fasta文件 fasta_result <- Biostrings::readDNAStringSet(fasta_file) # 返回读取结果 return(fasta_result) } # 调用函数,输入文件名后结果会赋值给my_fasta变量 my_fasta <- read_fasta_interactive()
方案2:基础R实现(无需安装额外包)
适合不想安装依赖包的场景,读取结果为序列名对应序列的命名向量
read_fasta_interactive_baseR <- function() { fasta_file <- readline(prompt = "请输入当前目录下的.fasta文件名:") if (!file.exists(fasta_file)) { stop("未找到指定文件,请检查文件名拼写及路径是否正确") } # 逐行读取文件 raw_lines <- readLines(fasta_file) # 定位所有序列头行 header_pos <- grep("^>", raw_lines) seq_num <- length(header_pos) seq_names <- sub("^>", "", raw_lines[header_pos]) seqs <- character(seq_num) # 解析每条序列 for (i in seq_len(seq_num)) { start_line <- header_pos[i] + 1 end_line <- ifelse(i == seq_num, length(raw_lines), header_pos[i+1] - 1) seqs[i] <- paste0(raw_lines[start_line:end_line], collapse = "") } fasta_result <- setNames(seqs, seq_names) return(fasta_result) } # 调用函数 my_fasta <- read_fasta_interactive_baseR()
内容的提问来源于stack exchange,提问作者Alex Silvestrini
相关产品推荐
相关产品推荐

