for循环的rownames输入到函数

时间:2016-01-27 18:03:30

标签: r for-loop

我有一个函数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_geneTryCatch的所有可能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

1 个答案:

答案 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文档中,但正如您在上面的灰色框中看到的那样,它们可以更宽。