Использование mapply для преобразования вектора поэлементно по вектору с функциями

есть вопрос по использованию mapply.

Рассмотрим следующие два случая: Случай 1, показывающий упрощенный пример того, что я хочу сделать. Я использую mapply для поэлементного преобразования моего вектора k с помощью функций, хранящихся в vector trans. Это работает (в связи с этим вопросом)

В случае 2 я хочу сделать что-то подобное, однако мне нужны дополнительные аргументы функции (здесь они хранятся в a). Но мне может понадобиться n аргументов функции. В этом примере я получаю матрицу 3x3 с ожидаемыми результатами по диагонали. Мне нужен только вычисленный вывод диагонали. Как?

k <- seq(1:3)
# Case 1 -----------------------------------------------------------------------
trans <- c(function(x) x, function(x) 1/x, function(x) x^2)             
# transform vektors elementwise with functions in a "transform" vektor
ktrans   <- mapply(function(f, x) f(x), trans, k)

# 2 -----------------------------------------------------------------------
k <- seq(1:3)
a <- rep(2,3)
transa <- c(function(x,a) x*a, function(x,a) 1/x*a, function(x,a) x^2*a)
ktransa   <- mapply(function(f, x,a) f(x,a), transa, MoreArgs= list(x = k, a= a))

> diag(ktransa)
[1]  2  1 18

person Toby    schedule 22.08.2013    source источник
comment
Случай 1 не работает, пока я не удалю a, иначе я получу Error in function (f, x) : unused argument(s) (dots[[3]][[1]]). Что именно вы пытаетесь сделать? В случае 2 вы вводите вектор в mapply, который должен выводить матрицу с каждым # в k, преобразованным каждым способом. Т.е., 3 числа каждое преобразовано 3 способами = матрица 3x3.   -  person gung - Reinstate Monica    schedule 22.08.2013
comment
почему бы вам не указать дополнительные аргументы в вызове функции? то есть mapply (function (f, x) f (x, arg1, arg2, arg3), transa) ??   -  person Karl Forner    schedule 22.08.2013
comment
Я хочу, чтобы mapply возвращал вектор диагноза текущего вывода mapply. То есть функции в векторе transa[i] используют k[i] и a[i] в качестве аргументов, тогда output является вектором. С i от 1 до length(transa) @ Карл: разве это не то, что я сделал в случае2?   -  person Toby    schedule 23.08.2013


Ответы (1)


Решение:

Вместо того, чтобы использовать список для отправки аргументов функции, я сделал это явно:

# 3 --- Example with n arguments -----------------------------------
k <- seq(1:3)
a <- rep(2,3)
transa <- c(function(x,a) x*a, function(x,a) 1/x*a, function(x,a) x^2*a)
ktransa   <- mapply(function(f, x, a) f(x,a), transa,x = k , a = a)
person Toby    schedule 23.08.2013