在循环中使用对象名称的子字符串

问题描述 投票:0回答:1

我在 R 中的分析有四个结果对象。 我想使用循环对它们进行相同的分析。我想制作一个通用脚本并使用名称的子字符串在我的文件上运行它。但是我不知道该怎么做。 我的对象的名称具有相同的名称,除了四个用于识别基因型的字符。

我想我可以使用类似于

bash
中的东西,我可以使用名称的子字符串进行循环,例如

for i in {7454620..7454643}; do 
  STAR --runThreadN 24 --readFilesIn ../surowe/ERR${i}_1.fastq.gz \\
  ../surowe/ERR${i}_2.fastq.gz --genomeDir ../../star-index --outSAMtype BAM SortedByCoordinate \\
--outFileNamePrefix ERR${i} --readFilesCommand zcat
done

我已经阅读了几页有关使用

lapply
for
循环的内容,但没有找到任何符合我需求的内容。

r for-loop lapply
1个回答
0
投票

这几乎肯定是重复的,但您正在寻找

sprintf
(或
paste0
glue
)和
get()
assign()
的组合。概括一个表达式,如

plus.a554.regr.vs.ch <- res.a554.leaf.regr.vs.ch[which(res.a554.leaf.regr.vs.ch$padj < 0.05 &
    res.a554.leaf.regr.vs.ch$log2FoldChange > 0),]

当您用不同的字符串替换

a554
时,您可以使用
get()
来获取基于字符串的变量,并使用
assign
来基于字符串设置它们的值,例如

v <- "a554"
recv_var <- sprintf("plus.%s.regr.vs.ch", v)
orig_var <- sprintf("res.%s.leaf.regr.vs.ch", v)
val <- with(orig_var, orig_var[padj < 0.05 & log2FoldChange > 0, ])
assign(recv_var, orig_var)

一些评论:

  • 这种方法在 R 中是不惯用的;一般建议/最佳实践是将不同的结果收集在一个列表中。然后,您可以使用
    lapply()
    (或
    for
    循环)轻松迭代列表(并生成结果列表)。
  • val <- 
    作业中,我使用
    with()
    使代码更加紧凑/可读(即
    with()
    允许我写
    padj
    log2FoldChange
    而不是
    orig_var$padj
    orig_var$log2FoldChange
    )。如果您喜欢 tidyverse,您也可以使用
    dplyr::filter()
    来完成此任务。 (另外,
    which()
    在这里是不必要的。)
  • 可以稍微压缩代码,但会牺牲可读性。
© www.soinside.com 2019 - 2024. All rights reserved.