Применение многомерной функции к двум спискам

У меня есть функция отображения следующим образом:

sub.func <- function(x,y){
  if(agrepl(x,y)){
    return(x)
  }
  else{
    return(y)
  }
}

теперь я хочу применить это для сравнения двух списков разного размера, скажем, myList1 и myList2, чтобы для каждого элемента myList1 sub.func искал совпадение в myList2 и, если да, заменял элемент myList2. Так что все элементы myList2 сопоставляются. Как я могу добиться этого без использования циклов? Любой вариант применения функций можно использовать?

e.g.

myList1 <- c("a b", "c d", "e f")

myList2 <- c("1", "a b d", "d", "e f g h", "2 3 a c d", "c g")

желаемый результат имеет ту же длину, что и myList2, но по возможности сопоставляется с myList1

output <- c("1", "a b", "d", "e f", "c d", "c g")

person DonDyck    schedule 24.10.2014    source источник
comment
Было бы полезно включить образец входных данных и желаемый результат, просто чтобы прояснить, чего вы хотите, и обеспечить простой способ проверки потенциальных решений. См. как сделать воспроизводимый пример   -  person MrFlick    schedule 24.10.2014
comment
Это, скорее всего, вызовет предупреждение и даст неправильные результаты, потому что agrepl является векторизованной функцией.   -  person Rich Scriven    schedule 24.10.2014
comment
Возвращает векторный результат, я имею в виду   -  person Rich Scriven    schedule 24.10.2014


Ответы (1)


Вы можете использовать функцию Reduce для этого

myList1 <- c("a b", "c d", "e f")
myList2 <- c("1", "a b d", "d", "e f g h", "2 3 a c d", "c g")

Reduce(function(vals, find) {vals[grep(find, vals)]<-find; vals}, myList1, myList2)
# [1] "1"   "a b" "d"   "e f" "c d" "c g"
person MrFlick    schedule 24.10.2014