Использование функции apply над полем строки с ожиданием суммированных результатов - PullRequest
0 голосов
/ 05 февраля 2019

Что происходит с функцией apply ниже?Почему он не дает желаемого результата?Есть ли простой способ получить желаемый результат, используя функцию apply?

Мне кажется, что мне не хватает чего-то действительно фундаментального в том, как работает функция apply.Я думаю, что это в основном сводится к следующим строкам в функции apply.

Строка № 67: else length(ans <- unlist(ans, recursive = FALSE))

Строка № 83: array(ans, c(len.a%/%d2, d.ans))

Но я все еще не совсем понимаю, что происходит.Я знаю, что есть другие, не apply, способы получения желаемого результата.Но сейчас я просто пытаюсь понять, что происходит с apply.

ff <- matrix(1:6,ncol=2)
# [,1] [,2]
# [1,]    1    4
# [2,]    2    5
# [3,]    3    6

bb <- matrix(7:10,ncol=2)
# [,1] [,2]
# [1,]    7    9
# [2,]    8   10

# DESIRE:
#  7 36
# 14 45
# 21 54
#  8 40
# 16 50
# 24 60

# This works (but isn't the general solution I'm looking for)
rr1 <- t(t(ff) * bb[1,])
rr2 <- t(t(ff) * bb[2,])
rbind(rr1,rr2)
# [,1] [,2]
# [1,]    7   36
# [2,]   14   45
# [3,]   21   54
# [4,]    8   40
# [5,]   16   50
# [6,]   24   60

# This produces the right numbers but swaps the off-diagonal blocks. Why?
apply(bb, MARGIN=1, function(x,y) t(t(y) * x), y=ff)
# [,1] [,2]
# [1,]    7    8
# [2,]   14   16
# [3,]   21   24
# [4,]   36   40
# [5,]   45   50
# [6,]   54   60

# Other formulations like these don't make a difference
apply(bb, MARGIN=2, function(x,y) t(t(y) * as.vector(t(x))), y=ff)
apply(bb, MARGIN=2, function(x) t(t(ff) * x))
...