R语言嵌套函数输出合并报错:对象未找到问题求助
解决R主函数无法访问嵌套函数输出的问题
你遇到的**“对象未找到”错误**,核心原因是R的函数作用域规则:嵌套函数内部定义的变量属于它自己的局部环境,主函数无法直接访问这些变量。你在test.merge里只定义了freq.epi和mis.test两个嵌套函数,但没有调用它们,也没有把它们的返回值传递到主函数的环境中,所以diff.mat和res_final对主函数来说是不存在的。
解决方案:调用嵌套函数并接收返回值
要让嵌套函数的输出在主函数中可用,你需要显式调用嵌套函数,并将它们的返回值赋值给主函数环境下的变量,之后再用这些变量执行合并操作。
修改后的完整主函数代码
library(dplyr) library(purrr) test.merge=function(D,DF,R,threshold,Vars,col.interest){ R=as.data.frame(R) D=as.data.frame(D) DF=as.data.frame(DF) col.interest=as.data.frame(col.interest) # 定义计算频率的嵌套函数 freq.epi<- function( Vars,col.interest){ resultat1= DF %>% group_by(across(all_of(Vars))) %>% dplyr::summarise(count = n(), frequency.epi = sum(fg), .groups = 'drop') res=merge(resultat1,col.interest,all=TRUE) res_final=cbind(DF[1:2],res) return(res_final) } # 定义计算 mismatch 的嵌套函数 mis.test = function(D, R, threshold) { D = as.data.frame(D) R = as.data.frame(R) mismatch.i = function(i) { dif = purrr::map2_df(D[-1], R[i,-1], `-`) dif[dif<0] = 0 dif$mismatch=rowSums(dif) dif = cbind(ID = D[1],IDr=R[i,1], dif) dif = dif[which(dif$mismatch <= threshold),] return(dif[c(1,2,ncol(dif))]) # 移除多余的list=,直接返回数据框 } diff.mat = do.call(rbind, lapply(1:nrow(R), function(x) mismatch.i(x))) diff.mat = as.data.frame(diff.mat) # 统一列名:将ID改为IDd,和freq.epi的输出匹配 colnames(diff.mat)[colnames(diff.mat)=="ID"] <- "IDd" return(diff.mat) } # 关键步骤:调用嵌套函数,将结果赋值到主函数环境 res_final <- freq.epi(Vars, col.interest) diff.mat <- mis.test(D, R, threshold) # 执行合并并返回结果 tab=merge(diff.mat,res_final,by="IDd") return(tab) }
关键修改说明
- 调用嵌套函数:在主函数中添加了
res_final <- freq.epi(Vars, col.interest)和diff.mat <- mis.test(D, R, threshold),把嵌套函数的输出拿到主函数的环境中。 - 统一列名:在
mis.test中将结果的ID列重命名为IDd,确保和freq.epi输出的列名一致,避免合并时出现列名不匹配的问题。 - 简化返回值:移除了
return(list=dif[...])中的list=,直接返回数据框,让后续处理更简洁。
测试运行
执行你原来的调用代码,现在可以正常得到合并结果:
test.merge(data_D[,c(1,3:7)],data_D,data_R[1,c(1,3:7)],2,colnames(data_D)[3:7],data_D[3:7])
额外的作用域知识补充
在R中,函数有独立的环境:
- 嵌套函数可以访问外层函数(比如主函数)的变量(比如
DF、D等参数) - 但外层函数无法直接访问嵌套函数内部的变量,必须通过函数的
return()将结果传递出来
内容的提问来源于stack exchange,提问作者Janet
相关产品推荐
相关产品推荐

