gpt4 book ai didi

R tryCatch 跳过错误

转载 作者:行者123 更新时间:2023-12-03 07:58:55 27 4
gpt4 key购买 nike

我尝试连接 2 个数据框:Eset2 和 Essential。它们共享 1 个包含基因名称的公共(public)列,并且两个框架都有唯一的行。

所以我决定在 Eset2 中查找我需要的值(RMA,ANNOT)并将它们绑定(bind)到 Essential 中具有相应基因名称的行。

但有时我无法查找,因为 Essential 中有独特的基因。所以,会有一个错误:我在 Eset2 中搜索相应的行会出现 numeric(0)。

所以我决定使用tryCatch。
但是,它没有帮助。当搜索在 Eset2 中没有找到这样的基因时,脚本不会为 RMA 和 ANNOT 输入 NA,而是输入上一个成功找到的基因的值。

    for (i in 1:nrow(essential)) {
temp <- tryCatch(
# eset2$GENENAMEand essential[,4] contain gene names
eset2[eset2$GENENAME == essential[i,4],]$RMA,
error = function(e) {
print("This is the 'error' part1")
return(NA)}
)
essential$rma[i] <- temp

temp <- tryCatch(
eset2[eset2$GENENAME == essential[i,4],]$ANNOT,
error = function(e) {
print("This is the 'error' part2")
return(NA)}
)
essential$long_name[i] <- temp
}

我通过使用它解决了这个问题:
        for (i in 1:nrow(essential)) {
temp <- try(eset2[eset2$SYMBOL == essential[i,4],]$rma)
if (length(temp) != 0) {
essential$rma[i] <- temp
}
else {
essential$rma[i] <- NA
}
temp <- try(eset2[eset2$SYMBOL == essential[i,4],]$GENENAME)
if (length(temp) != 0) {
essential$long_name[i] <- temp
}
else {
essential$long_name[i] <- NA
}
}

我想知道我是否使用 tryCatch 错误。
我试过这样做:
         temp <- eset2[eset2$GENENAME == essential[i,4],]$ANNOT

但这没有帮助。
你能明白为什么我的 tryCatch 失败了吗?

最佳答案

我相信错误 block 从未被评估的原因是数据帧子集评估为 numeric(0)不是错误。相反,您应该明确检查 numeric(0)并替换为 NA当你遇到它时:

for (i in 1:nrow(essential)) {
temp <- eset2[eset2$GENENAME == essential[i,4],]$RMA
essential$rma[i] <- ifelse(length(temp) == 0, NA, temp)

temp <- eset2[eset2$GENENAME == essential[i,4],]$ANNOT
essential$long_name[i] <- ifelse(length(temp) == 0, NA, temp)
}

顺便说一句,可能有一种方法可以矢量化 for您使用的循环,可能会将整个循环减少到几行 R 代码。但是这个答案有望阐明为什么错误 block 从未被击中,以及您可以做些什么作为替代方案。

关于R tryCatch 跳过错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39751168/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com