Part1:
Отвечая на часть вашего вопроса о том, как понимать функции на более глубоком уровне, если документации недостаточно, не вдаваясь в детали функции which ().
Поскольку match () не является примитивной функцией (которая написана на C), то есть написана с использованием основных строительных блоков R, мы можем проверить, что происходит за кулисами, распечатав саму функцию. Обратите внимание, что использование обратных галочек позволяет проверять функции с зарезервированными именами, например, + и, следовательно, не является обязательным в этом примере. Этот плотный R-код может быть чрезвычайно утомительным для чтения, но я нашел его очень познавательным, и он время от времени решает некоторые умственные узлы.
> print(`which`)
function (x, arr.ind = FALSE, useNames = TRUE)
{
wh <- .Internal(which(x))
if (arr.ind && !is.null(d <- dim(x)))
arrayInd(wh, d, dimnames(x), useNames = useNames)
else wh
}
<bytecode: 0x00000000058673e0>
<environment: namespace:base>
Ч.2:
Итак, после того как я отказался от попыток понять функцию which и arrayInd способом, описанным выше, я пробую это со здравым смыслом. Наиболее эффективный способ проверить каждое значение матрицы / массива, которое имеет для меня смысл, - это в какой-то момент преобразовать его в одномерный объект. Приведение от матрицы к атомному вектору или любое уменьшение размеров всегда приведет к объединению полных столбцов каждого измерения, поэтому для меня естественно, что функции более высокого уровня также будут следовать этому фундаментальному правилу.
> testmat <- matrix(1:10, nrow = 2, ncol = 5)
> testmat
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> as.numeric(testmat)
[1] 1 2 3 4 5 6 7 8 9 10
Я нашел Advanced R Хэдли Уикхэма чрезвычайно ценным ресурсом, чтобы ответить на ваш вопрос, особенно главы о функциях и структурах данных.
[http://adv -r.had.co.nz /] [1]