2013-08-22 65 views
1

有一个关于使用mapply的问题。使用映射将矢量变换为矢量功能

请考虑以下两种情况: 案例1显示了我想要做的简化示例。我使用mapply将矢量k元素转换为矢量trans中存储的函数。此作品(related to this question

案例2我希望做同样的事情,但是,我想额外的函数参数(在这里,存储在一个),但我可能要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 
+0

**案例1 **不工作,除非我删除'a',否则我得到'函数错误(f,x):未使用的参数(s)(dots [[3]] [[1]])''。你准备做什么?在**情况2 **中,你正在将一个矢量送入'假设'的'mapply'中,以输出一个矩阵w /每个#k在每个方向转换为'k'。也就是说,每3个数字转换3种方式= 3x3矩阵。 – gung

+0

为什么你不在函数调用中提供额外的参数?即函数(函数(f,x)f(x,arg1,arg2,arg3),transa) –

+0

我想要mapply来返回当前输出输出的diag向量。即矢量'transa [i]'中的函数使用'k [i]'和'a [i]'作为参数,输出则是一个矢量。随着我从1到'长度(经管)' @卡尔:是不是我在case2做的? – Toby

回答

0

解决方案:

而不是使用一个列表参数发送给函数的,我做到了明确:

# 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)