簡體   English   中英

在 lapply 中增加多個 arguments

[英]increment multiple arguments in lapply

有沒有辦法在 lapply function 中增加兩個 arguments? 例如

test <- function(pos,value){
   list[pos,value]
}

data=c(1,4,32,54) #not global
lapply(X=1:length(data),test, value=data[X])#this is the idea but the code doesnt work

output 將是list(list(1,1),list(2,4),list(3,32),list(4,54))

另一個例子是

test <- function(pos,value,value2){
   list(pos,value,value2)
}

data=c(1,4,32,54) #not global
data2=c(2,6,3,21) #not global
lapply(X=1:length(data),test, value=data[X], value2=data2[X]) #this is the idea but the code doesn't work

output 將是list(list(1,1,2),list(2,4,2),list(3,32,6),list(4,54,21))

這也可能有所幫助。 我非常想將 for 循環更改為 lapply。

test <- function(pos,value,value2){
   list(pos,value,value2)
}

data=c(1,4,32,54) #not global
data2=c(2,6,3,21) #not global
for(i:length(data)){
  result=list(result,test(i,data[i],data2[i]))
}

由於變量不是全局變量,我無法將測試 function 作為

test <- function(pos){
   list(pos,data[pos],data2[pos])
}

我知道有一種更簡單的方法可以編寫此代碼來完成同樣的事情。 但我正在尋找一種方法來專門增加兩個變量,或者在參數中使用增加的值。 示例中使用的變量不是全局變量,所以我不能在 function 中使用它們,它需要使用 lapply function。 在代碼中,lapply 行不起作用,它只是展示了我正在嘗試做的事情的概念。 謝謝你。

編輯

所以在了解了mapply function之后。 我意識到我想要的是創建一個像 mapply 一樣的 lapply function

使用“<-”賦值運算符:

num_vec <- c(1, 4, 32, 54)

num_vec2 <- c(2, 6, 3, 21)

# Using lapply: 

lapply(seq_along(num_vec), function(x){return(c(x, num_vec[x], num_vec2[x]))})

使用“=”賦值運算符:

num_vec = c(1, 4, 32, 54)

num_vec2 = c(2, 6, 3, 21)

# Using lapply: 

lapply(seq_along(num_vec), function(x){return(c(x, num_vec[x], num_vec2[x]))})

在上述情況下,賦值運算符沒有任何區別,並且與局部或全局賦值無關。

響應有關希望根據任一向量中的值檢索元素的附加查詢:

num_vec = c(1, 4, 32, 54)


num_vec2 = c(2, 6, 3, 21)

test <- function(num_vec, num_vec2, val) {
  if (!hasArg(val)) {
    val <- 1:max(c(num_vec, num_vec2))
  } else{
    as.numeric(c(val))
  }

  lapply(seq_along(num_vec),

         function(x) {
           return(c(x, num_vec[x], num_vec2[x]))
         })[ifelse(
           val %in% num_vec &

             !(val %in% num_vec2),

           which(num_vec %in% val),

           ifelse(
             !(val %in% num_vec2) &

               !(val %in% num_vec2),

             0,

             ifelse(
               val %in% num_vec &

                 val %in% num_vec2,

               c(which.min(
                 which(val %in% num_vec), which(val %in% num_vec2)
               ),

               which.max(
                 which(val %in% num_vec), which(val %in% num_vec2)
               )),

               which(val %in% num_vec2)
             )
           )
         )]

}

test(num_vec, num_vec2, 54)

我猜在你的情況下, mapply是比lapply更好的選擇。

假設您有可變數量的輸入 arguments,您可以將test重寫為

test <- function(pos,...){
  list(pos, ...)
}

在您的示例中輸入

data=c(1,4,32,54) #not global
data2=c(2,6,3,21) #not global

使用mapply可以讓你到達那里:

mapply(test, seq_along(data), data, data2, SIMPLIFY = F)

只需添加@hello_friend 的答案,您就可以使用 lapply 將 arguments 傳遞給 function。 從問題中,我了解到您想將多個參數傳遞給 function。 下面的代碼試圖做到這一點。 請看一看。

vec1 <- c(1, 3, 5, 7)

vec2 <- c(2, 4, 6, 8)

test <- function(pos, vec_arg1, vec_arg2){
  return(c(pos, vec_arg1[pos], vec_arg2[pos]))
}
# Using lapply: 

lapply(seq_along(num_vec), test, vec1, vec2)

暫無
暫無

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

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