Попарный цикл через несколько векторов в R

Что у меня в R?

Следующие векторы:

N <- c('a','b')
M <- c('x','y')

Цель

Сохраняя векторы нетронутыми (я не хочу объединять их в матрицу), я бы хотел назвать элементы векторов следующим попарно:

"a" "x" "b" "y"

Код пока что.

Я пытался использовать for цикл, но, как написано ниже, он читается как вложенный цикл:

for (i in M) for (j in N)  { 
 print(i)
 print(j)
}

Что приводит к:

"a" "x" "a" "y" "b" "x" "b" "y"

Что я искал

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

Настоящая цель.

Я хотел бы добавить одну строку текста в изображение. Текстовые теги хранятся в одном векторе, а изображения также. У меня до сих пор работает код, за исключением вызова элементов векторов попарно, как описано выше. Есть много картинок, а жизнь слишком коротка, чтобы делать все вручную.

Любая помощь будет принята с благодарностью!

Стейн

3 ответа

Решение

Как это объясняется в "реальной цели", каждый элемент в векторах "текстовых тегов" соответствует элементу в "векторе изображений". Если это правильно, не так ли просто решение (учитывая, что оба вектора имеют одинаковую длину):

for (i in textTags)
  addThisToThat(textTags[i], images[i])

Мы можем rbind векторы, а затем объединить

c(rbind(M, N))
#[1] "x" "a" "y" "b"

Или другой вариант order на основе последовательности vector

c(M, N)[order(c(seq_along(M), seq_along(N)))]
#[1] "x" "a" "y" "b"

Если нам действительно нужно for цикл, а затем предварительно выделить list с length равное количеству элементов в "M", выполнить цикл по последовательности одного из векторов и назначить объединенные элементы "M" и "N" на основе индекса для list элемент и unlist Это

l1 <- vector("list", length(M))
 for(i in seq_along(M)){
   l1[[i]] <- c(M[i], N[i])
 }
unlist(l1)
#[1] "x" "a" "y" "b"

Знаете ли вы о Lapply? В пакете purrr вы можете найти его эквивалент: map. Вы также можете найти там map_2, который синхронизирует два вектора. Синтаксис похож на map_2(vec1, vec2, ~some_function_of(.x, .y))

Для других людей, задающих этот вопрос, я рекомендую использовать базовую функцию R. mapply. В отличие отfor цикл, он автоматически определяет переменные n а также m для каждой петли.

mapply(N, M, function(n, m) {
   print(n)
   print(m)
})

Обратите внимание: это не сработает, если вы хотите что-то печатать в каждом цикле.

Другие вопросы по тегам