2011-06-05 4 views
1

Есть ли версия Vectorize, которая использует apply, а не mapply? Я хотел был бы векторизовать функцию, которая принимает векторный вход таким образом, который позволяет мне передать массив этой функции и вернуть вектор.Версия Vectorize() для apply(), а не mapply()?

Конечно, я могу написать свою собственную упаковку, и это работает достаточно хорошо. Но я задавался вопросом, построена ли эта функциональность?

Я также могу использовать Vectorize, но тогда мне нужно преобразовать матричный вход в data.frame для его работы. Например:

LAMBDA <- cbind(c(1, .5, .5), c(.5, 1, .5), c(.5, .5, 1)) 
THETA <- c(0,0,1) 
NU <- 21 
my.data <- array(1:6, c(3,2)) 
my.fun <- Vectorize(pmt, vectorize.args="x") 

Тогда

> my.fun(my.data, mean=THETA, S=LAMBDA, df=NU) 
[1] 0.4404142 0.8130572 0.9667065 0.9961166 0.9996274 0.9999676 

Который не то, что я хочу, но

> my.data <- data.frame(my.data) 
> my.fun(my.data, mean=THETA, S=LAMBDA, df=NU) 
     X1  X2 
0.8130572 0.9996274 

является то, что я хочу.

BTW, pmt является из пакета mnormt и является многоквартирным студентом t cdf.

ответ

1

Похоже, вы хотите, чтобы определить функцию my.fun, к которому вы передаете в матрице my.data и my.fun просто «знать», что необходимо применить функцию к каждому столбцу my.data. Это то, что должно делать функция apply(); вам не нужен звонок Vectorize. Так почему бы не просто сделать это:

my.data <- array(1:6, c(3,2)) 

> apply(my.data, 2, pmt, mean=THETA, S=LAMBDA, df=NU) 

[1] 0.8130572 0.9996274 
+0

Вы имеете в виду 'my.data' может быть вектором вместо матрицы? Если да, можете ли вы просто создать матрицу с одним столбцом? – Aaron

+0

Если это так, все, что вам нужно, это 'apply (matrix (my.data, nrow = 3), 2, pmt, mean = THETA, S = LAMBDA, df = NU)'. Это работает как на векторах, так и на матрицах. – Aaron

+0

@ Решение Aaron лучше, чем мое решение if then else, по крайней мере, с точки зрения удобочитаемости. Я думаю, что 'Vectorize' делает что-то подобное в' args <- lapply (as.list (match.call()) [- 1L], eval, parent.frame()) '. Не то, чтобы я это полностью понял. – kalu

 Смежные вопросы

  • Нет связанных вопросов^_^