使用function()简化GAlignment对象重复代码时遇错误求助
问题:优化重复R代码时的函数调用错误
原重复代码(44次重复中的4个样本)
tissue <- data.frame(tissue = c("oneleaf_1", "oneleaf_2","oneroot_1", "oneroot_2")) # 1Leaf1 uORFsCount1Leaf1=countOverlaps(uORFs,oneleaf_1_bam_f, minoverlap=18) uORFsCount1Leaf1_df <- as.data.frame(uORFsCount1Leaf1) uORFsCount1Leaf1_v <- uORFsCount1Leaf1_df[['uORFsCount1Leaf1']] uCounts_1Leaf1 <-sum(uORFsCount1Leaf1_v, na.rm=TRUE) uFrac_1Leaf1 = uCounts_1Leaf1/100 # 1Leaf2 uORFsCount1Leaf2=countOverlaps(uORFs,oneleaf_2_bam_f, minoverlap=18) uORFsCount1Leaf2_df <- as.data.frame(uORFsCount1Leaf2) uORFsCount1Leaf2_v <- uORFsCount1Leaf2_df[['uORFsCount1Leaf2']] uCounts_1Leaf2 <-sum(uORFsCount1Leaf2_v, na.rm=TRUE) uFrac_1Leaf2 = uCounts_1Leaf2/100 # 1Root1 uORFsCount1Root1=countOverlaps(uORFs,oneroot_1_bam_f, minoverlap=18) uORFsCount1Root1_df <- as.data.frame(uORFsCount1Root1) uORFsCount1Root1_v <- uORFsCount1Root1_df[['uORFsCount1Root1']] uCounts_1Root1 <-sum(uORFsCount1Root1_v, na.rm=TRUE) uFrac_1Root1 = uCounts_1Root1/100 # 1Root2 uORFsCount1Root2=countOverlaps(uORFs,oneroot_2_bam_f, minoverlap=18) uORFsCount1Root2_df <- as.data.frame(uORFsCount1Root2) uORFsCount1Root2_v <- uORFsCount1Root2_df[['uORFsCount1Root2']] uCounts_1Root2 <-sum(uORFsCount1Root2_v, na.rm=TRUE) uFrac_1Root2 = uCounts_1Root2/100
尝试的简化函数
tissue <- data.frame(tissue = c("oneleaf_1", "oneleaf_2","oneroot_1", "oneroot_2")) fract_calc <- function(tissue){ uORFsCountTissue=countOverlaps(uORFs,paste0(tissue,"_bam_f"), minoverlap=18) uORFsCountTissue_df <- as.data.frame(uORFsCountTissue) uORFsCountTissue_v <- uORFsCountTissue_df[['uORFsCountTissue']] uCounts_Tissue <-sum(uORFsCountTissue_v, na.rm=TRUE) paste0("uFrac_",tissue,"") <- uCounts_Tissue/100 return(uFrac_tissue) }
调用时的错误信息
> fract_calc(one_leaf1) Error in h(simpleError(msg, call)) : error in evaluating the argument 'subject' in selecting a method for function 'countOverlaps': object 'one_leaf1' not found
问题分析与解决方法
错误原因
- 参数传递错误:调用
fract_calc(one_leaf1)时,one_leaf1是未定义的对象,实际应传入字符串形式的组织名称(如"oneleaf_1")。 - 对象引用错误:函数中
paste0(tissue,"_bam_f")生成的是字符串,但countOverlaps需要实际的bam对象,而非字符串名称,需用get()函数根据字符串获取环境中的对象。 - 变量赋值与返回错误:
paste0("uFrac_",tissue,"") <- ...的赋值方式无效,且返回的uFrac_tissue未定义。
修正后的函数与调用方式
# 修正后的函数 fract_calc <- function(tissue_name){ # 根据字符串获取对应的bam对象 bam_obj <- get(paste0(tissue_name, "_bam_f")) # 计算重叠数 uORFsCount <- countOverlaps(uORFs, bam_obj, minoverlap=18) # 求和并计算比例 uCounts <- sum(uORFsCount, na.rm=TRUE) uFrac <- uCounts / 100 # 返回包含组织名称和比例的列表 return(list(tissue = tissue_name, uFrac = uFrac)) } # 批量处理所有组织 tissue_list <- c("oneleaf_1", "oneleaf_2","oneroot_1", "oneroot_2") results <- lapply(tissue_list, fract_calc) # 转换为数据框,方便后续分析 results_df <- do.call(rbind, lapply(results, data.frame)) # 若需保留原单个变量格式(不推荐,优先用数据框管理) for(res in results){ assign(paste0("uFrac_", res$tissue), res$uFrac) }
说明
- 使用
get()函数通过字符串名称获取环境中的bam对象,解决了参数类型不匹配的问题。 - 函数返回包含组织名称和比例的列表,批量处理后可转换为数据框,比单独创建44个变量更易维护。
- 若确实需要保留原有单个变量格式,可通过
assign()循环创建,但更推荐用数据框统一管理结果。
内容的提问来源于stack exchange,提问作者Stef
相关产品推荐
相关产品推荐

