Вопрос по r – R - как получить значение многомерного массива по вектору индексов

13

Error: User Rate Limit ExceededpiError: User Rate Limit Exceeded

dims <- rep(3, dim_count)
pi <- array(0, dims)

Error: User Rate Limit Exceededdim_countError: User Rate Limit Exceeded

dim_count <- 5
indexes <- c(1, 2, 3, 3, 3)

Error: User Rate Limit Exceeded

pi[1, 2, 3, 3, 3]

Error: User Rate Limit Exceeded

Ваш Ответ

3   ответа
15

Использование малоизвестного использования[:

When indexing arrays by [ a single argument i can be a matrix with as many columns as there are dimensions of x; the result is then a vector with elements corresponding to the sets of indices in each row of i.

Вы можете просто сделать:

pi[matrix(indexes, 1)]
+1 Ура за индексирование матрицы!
4

do.call() это вариант:

indexes <- c(1, 2, 2, 2, 3)
dims <- rep(3, dim_count)
pi <- array(seq_len(prod(dims)), dims)

do.call(`[`, c(list(x = pi), as.list(indexes)))

Который дает:

> do.call(`[`, c(list(x = pi), as.list(indexes)))
[1] 202
> pi[1, 2, 2, 2, 3]
[1] 202

Сложно получить список аргументов в правильном формате.pi должен быть первым аргументом"[" (или назван в качестве аргументаx, увидеть?"["), хотя мы хотим, чтобы каждый элементindexes сам является компонентом предоставленного списка, а не вектором в этом списке. Отсюда запутанныйc(list(x = pi), as.list(indexes)).

Альтернативный способ создать список аргументов, который может быть проще следовать:

ARGS <- vector("list", length = dim_count + 1)
ARGS[[1]] <- pi
ARGS[2:length(ARGS)] <- indexes
do.call("[", ARGS)

который дает

> do.call("[", ARGS)
[1] 202
> pi[1, 2, 2, 2, 3]
[1] 202
10

do.call("[",...) похоже на работу.

indexes <- c(1,2,3,3,3)
pi[1,2,3,3,3] <- 17  ## so we know if we succeeded or not
do.call("[",c(list(pi),as.list(indexes)))

Обратите внимание, что ваш пример не будет работать - все ваши измерения были 3, но некоторые из ваших элементов индекса были & gt; 3 ...

О, ты был здесь немного быстрее меня. +1.
да, конкретный пример был частично составлен так, чтобы показать наименьший значимый фрагмент кода, и я этого не заметил :) nietaki

Похожие вопросы