увеличить несколько аргументов в lapply - PullRequest
2 голосов
/ 04 ноября 2019

Есть ли способ увеличить два аргумента в функции lapply? Например,

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

Выход будет 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

Выход будет 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]))
}

Поскольку переменные не являются глобальными, у меня не может быть тестовой функции как

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

Я знаю, что тамэто более простой способ написания этого кода, чтобы выполнить то же самое. Но я ищу способ специально увеличить две переменные или использовать увеличенное значение в аргументе. Переменные, используемые в примерах, не являются глобальными, поэтому я не могу использовать их в функции, и для этого нужно использовать функцию lapply. В кодах лишние строки не работают, это была просто демонстрация концепции того, что я пытаюсь сделать. Спасибо.

Редактировать

Итак, после изучения функции mapply. Я понял, что хочу создать функцию lapply, которая работает как mapply

Ответы [ 3 ]

1 голос
/ 04 ноября 2019

Полагаю, mapply - лучший выбор, чем lapply в вашем случае.

Если у вас есть переменное количество входных аргументов, вы можете переписать 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)
1 голос
/ 04 ноября 2019

Использование оператора присваивания "<-": </p>

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)
0 голосов
/ 04 ноября 2019

Просто добавив к ответу @hello_friend, вы можете передать аргументы функции, используя lapply. Из вопроса я понимаю, что вы хотите передать более одного аргумента в функцию. Код ниже пытается это сделать. Пожалуйста, посмотрите.

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)
...