【问题标题】:Using for loop to append vectors of variable length使用 for 循环附加可变长度的向量
【发布时间】:2021-10-08 02:49:49
【问题描述】:

我正在尝试根据对列的各个元素执行的函数的输出创建一个向量或值列表。

library(hpoPlot)
xyz_hpo <- c("HP:0003698", "HP:0007082", "HP:0006956")

getallancs <- function(hpo_col) {
  for (i in 1:length(hpo_col)) {
    anc <- get.ancestors(hpo.terms, hpo_col[i])
    output <- list()
    output[[length(anc) + 1]] <- append(output, anc)
  }
  return(anc)
}

all_ancs <- getallancs(xyz_hpo)

get.ancestors 根据每个术语输出一个可变长度的字符向量。如何循环通过 hpo_col 将每个 ancs 向量的长度添加到输出向量?

【问题讨论】:

  • output &lt;- list()放在你的for循环之外(在它之前)和return(output)而不是return(anc)

标签: r loops variables vector append


【解决方案1】:

欢迎来到 Stack Overflow :) 提供了一个可重现的最小示例!

如 cmets 中所述,您需要将 output &lt;- list() 移出您的 for 循环,并在循环后将其返回。目前它正在为循环的每次迭代重置,这不是您想要的。我也觉得你想返回一个向量而不是一个列表,所以我改变了output的类型。

另外,在你原来的问题中,你说你想返回循环中每个anc 向量的长度,所以我改变了函数来输出每次迭代的长度,而不是整个向量。

getallancs <- function(hpo_col) {
    output <- numeric()
    for (i in 1:length(hpo_col)) {
        anc <- get.ancestors(hpo.terms, hpo_col[i])
        output <- append(output, length(anc))
    }
    return(output)
}

如果您仅针对少数情况(例如您的示例)执行此操作,则此方法会很好,但是,此范例在 R 中通常很慢,如果可能,最好尝试vectorise 这种计算方式.如果您要为大量计算需要几秒钟以上的元素运行此程序,这一点尤其重要。

例如,上面的函数可以被矢量化的一种方式是这样的:

all_ancs <- sapply(xyz_hpo, function(x) length(get.ancestors(hpo.terms, x)))

如果实际上您的意思是输出anc 的整个向量,而不仅仅是长度,那么原始函数将如下所示:

getallancs <- function(hpo_col) {
    output <- character()
    for (i in 1:length(hpo_col)) {
        anc <- get.ancestors(hpo.terms, hpo_col[i])
        output <- c(output, anc)
    }
    return(output)
}

或者可以是矢量化版本

all_ancs <- unlist(lapply(xyz_hpo, function(x) get.ancestors(hpo.terms, x)))

希望对您有所帮助。如果它解决了您的问题,请将其标记为答案。

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2020-10-25
    • 2021-09-10
    • 2013-05-07
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多