簡體   English   中英

對函數中的多個 if 語句進行向量化

[英]Vectorizing multiple if statements in a function

我正在嘗試創建一個函數,該函數接收一個單詞並根據該單詞所屬的組返回一個數字,我創建了以下函數,該函數僅適用於單個輸入:

get_humor <- function(x) {

  feeling <- str_to_lower(x)

  if (x %in% group5) return(5)
  if (x %in% group4) return(4)
  if (x %in% group3) return(3)
  if (x %in% group2) return(2)
  if (x %in% group1) return(1)


}

我知道我可以使用嵌套的 ifelses,如下所示:

ifelse(x %in% nv5, 5, 
         ifelse(x %in% nv4, 4,
                ifelse(x %in% nv3, 3,
                       ifelse(x %in% nv2, 2, 1))))

但是有一種方法可以在不使用其他輔助函數(如lapply()Vectorize()情況下制作此函數的矢量化版本?

這是一個選項。 關鍵是將您的組存儲在您可以循環/應用/映射的列表中。

groups <- list(group1, group2, group3, group4, group5)

# Using apply
get_humor <- function(x, groups) {
  x_in <- sapply(groups, function(g) x %in% g)
  max(which(x_in))
}

# Using purrr
get_humor <- function(x, groups) {
  x_in <- purrr::map_lgl(groups, function(g) x %in% g)
  max(which(x_in))
}

這將檢查x屬於哪些組並返回最高的組索引。

另一種選擇是在找到一組后立即返回。 這可以通過for循環來完成,也可以使用來自purrr detect_indexpurrr ,它只是在單行中完成。

purrr::detect_index(groups, ~ x %in% ., .dir = "backwards")

注意默認情況下, detect_index將返回謂詞為真的第一個索引。 由於您想要最后一個索引,您需要指定.dir = "backwards"

這是 for 循環在R實際上有意義的示例之一,因為您不想要所有可能的返回值的列表,並且如果您找到了正確的返回值,則不需要其他的。 那么,這個怎么樣:

get_humor <- function(x, groupList)
    for (i in seq_along(groupList)){
        if (x %in% groupList[[i]]) return(i)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM