Использование mapply для отдельных элементов списка - PullRequest
2 голосов
/ 07 июля 2019

У меня есть список:

ls <- list(c(a,b),c(i,j))
a<-"char1"
b<-"char2"
i<-"char4"
j<-"char5"

Мне нужно применить следующие функции к отдельным элементам списка

f1<- function(x) {
  switch(x,
         "char1"=1,
         "char2"=2,
         "char3"=3
  )
}

f2 <- function(x){
  switch(x,
         "char4"=1,
         "char5"=2,
         "char6"=3
  )
}

Это то, что я пытался, но я получаю ошибку

mapply(function(dat, fun) fun(dat), ls, list(f1,f2))

Ошибка в переключателе (x, char1 = 1, char2 = 2, char3 = 3): EXPR должен быть вектором длины 1

Я вижу, что x в switch должно иметь длину 1. Прямо сейчас я думаю, что x принимает c(a, b).

В принципе, я бынравится применять f1 к a с x=a, применять f1 к b с x=b, применять f2 к i с x=i, применять f2 к j сx=j

Когда я пробую mapply для 1 функции над 1 списком, она работает правильно

mapply (function (dat, fun) fun (dat), c (a, b), список (f1))

1 Ответ

1 голос
/ 08 июля 2019

Функции принимают только вектор длины 1. Итак, мы можем Vectorize it

Map(function(dat, fun) fun(dat), ls, list(Vectorize(f1), Vectorize(f2)))
#[[1]]
#char1 char2 
#    1     2 

#[[2]]
#char4 char5 
#    1     2 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...