我有一个函数tryCatch,输出如下内容:
> s1 <- tryCatch(survdiff(Surv(as.numeric(as.character(ClinicalDataHep$new_death))[ind_clin],ClinicalDataHep$death_event[ind_clin])~event_rna[ind_gene,ind_tum]), error = function(e) return(NA))
> s1
Call:
survdiff(formula = Surv(as.numeric(as.character(ClinicalDataHep$new_death))[ind_clin],
ClinicalDataHep$death_event[ind_clin]) ~ event_rna[ind_gene,
ind_tum])
N Observed Expected (O-E)^2/E (O-E)^2/V
event_rna[ind_gene, ind_tum]=0 72 41 41.1 0.000223 0.00278
event_rna[ind_gene, ind_tum]=1 4 4 3.9 0.002345 0.00278
Chisq= 0 on 1 degrees of freedom, p= 0.958
从这个输出中可以计算出如下的p值:
> p.val <- 1 - pchisq(s1$chisq, length(s1$n) - 1)
> p.val
[1] 0.9579535
我想在第一个函数中创建一个for循环,它使ind_gene
中TryCatch
的所有可能rownames(matrix_cpm_spike_liver)
定义为ind_gene
,获取所有p值不同的rownames 。
> head(rownames(matrix_cpm_spike_liver))
[1] "hsa-let-7a-2-3p" "hsa-let-7a-3p" "hsa-let-7a-5p" "hsa-let-7b-3p" "hsa-let-7b-5p"
[6] "hsa-let-7c-3p"
的示例:
for (i in rownames(matrix_cpm_spike_liver))
{TryCatch...
}
类似的东西:
Error launching emulator: Cannot run program "/Users/S/Library/Android/sdk/tools/emulator": error=13, Permission denied
答案 0 :(得分:2)
执行此操作的一种方法是围绕所有内容包装函数并使用sapply
。这样您就不必更改代码了。为了使循环成功,我们必须处理tryCatch
捕获错误的情况。这是通过p值上的ifelse
来完成的。
mycatch <- function(ind_gene){
s1 <- tryCatch(survdiff(Surv(as.numeric(as.character(
ClinicalDataHep$new_death)
)[ind_clin], ClinicalDataHep$death_event[ind_clin]) ~
event_rna[ind_gene,ind_tum]),
error = function(e) return(NA))
p.val <- ifelse(is.na(s1), # Condition
NA, # Return if s1 = NA
1 - pchisq(s1$chisq, length(s1$n) - 1))
p.val
}
sapply(rownames(matrix_cpm_spike_liver), mycatch)
请注意我如何分割你的代码行 - 通常认为没有太长的代码行是一种好习惯。我使用最多65,因为我偶尔会将其粘贴到TeX文档中,但正如您在上面的灰色框中看到的那样,它们可以更宽。