Эфектыўна стварыць матрыцу з значэнняў функцыі

What would experienced R developers consider the most efficient (yet still readable) way to construct a matrix with a given number of rows and columns from a given function, such that e.g. A_ij = someFun(i,j) with 1 <= i <= rows, 1 <= j <= cols?

Так як я не мог знайсці нешта ў дакументацыі, якую я прыдумаў

initMatrix <- function(rows, cols, fn) {
    A <- matrix(nrow=rows, ncol=cols)
    for (i in 1:rows)
        for (j in 1:cols)
            A[i,j] <- fn(i,j)
    return(A)
}

які здаецца дурным і павольна да мяне. Любыя паляпшэння (асабліва однострочечники) Сардэчна запрашаем! :)

6

3 адказы

Я думаю, што вы шукаеце вонкавыя (паслядоўнасць (радкі), паслядоўнасць (COLS), Fn) (ці, як прапанавана ніжэй, вонкавага (seq_len (радкі), seq_len (перавалы), п ) : спатрэбіцца некалькі прыкладаў, каб убачыць, як шмат адрозненняў, якія зрабілі).

Вы можаце атрымаць шмат у чытальнасці (прынамсі, калі вы не павінны ісці шукаць ? Вонкавы , каб даведацца, што адбываецца) гэты шлях, але я на самой справе не думаю, што вам зэканоміць шмат часу , Нешта разумней і больш эфектыўным можа апынуцца немагчымым, калі ваш п гэта векторизация для пачатку: гэта?

7
дададзена
Або з seq_len , а не сл .
дададзена аўтар Richie Cotton, крыніца
Дзякуем Вам за адказ на гэты адзін так хутка! Што тычыцца векторизации $ п $ тычыцца ..., на жаль, няма. Як вы можаце здагадацца, што я досыць новае для R (я прывык да Numpy/SciPy, клён і да таго падобнае), і менавіта таму я не даведаўся, як векторизации функцыі яшчэ.
дададзена аўтар fotNelton, крыніца

паглядзець на вонкавага :

> outer (LETTERS [1:3], letters [4:7], paste)
     [,1]  [,2]  [,3]  [,4] 
[1,] "A d" "A e" "A f" "A g"
[2,] "B d" "B e" "B f" "B g"
[3,] "C d" "C e" "C f" "C g"
6
дададзена

Калі вы проста напісаць якую-небудзь функцыю, вы можаце атрымаць памылкі, якія патрабуюць «знешнія», так Vectorize яго першым.

fn <- function(i,j){ ... }

A <- outer(1:rows, 1:cols, Vectorize(fn))

Прыклад, дзе ён не будзе працаваць без векторизации:

fn <- function(i,j){
  return(prop.test(c(tables[i,1], tables[j,1]), c(sum(tables[i,]), sum(tables[j,])))$p.value)
  }
1
дададзена
Не маглі б вы прывесці прыклад для такой функцыі?
дададзена аўтар fotNelton, крыніца
Дзякуй за абнаўленне.
дададзена аўтар fotNelton, крыніца
Любая функцыя, якая не працуе пры выкліку на вектары адзін я сутыкнуўся з гэтай праблемай з Сяргеем Мартынавым быў (дададзены ў рэдагавання)
дададзена аўтар Spine Feast, крыніца