在R中同时使用功能

时间:2016-03-25 20:14:51

标签: r matrix

我在R中有2个函数,第一个是:

cyii=function(a,b,L) 
{
  d=outer(a,b,`-`);I=outer(a,b,`==`)
  d=d[upper.tri(d,diag=T)];I=I[upper.tri(I,diag=T)]
  L[1]^2*exp(-0.25*d^2/L[2]^2) +  I*L[3]^2
}

第二个函数多次调用第一个函数

zii=list()
  for(i in 1:(n-1))
  {
    zii[[i]]=cyii(v1,v1,H[c(5*i-4,5*i-3,5*n-3+i)])
  }

其中v1是任何数字向量,H是参数向量。以下是可重复的示例。

dput(v1)=c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
dput(H)=c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
n=3

是否有可能使用apply函数或任何其他方法以避免使用for循环,因为对于每个n我需要提供具有来自H的不同值的第一个函数

1 个答案:

答案 0 :(得分:1)

是的,根本不应该是一个问题

# What you supplied
cyii=function(a,b,L) 
{
  d=outer(a,b,`-`);I=outer(a,b,`==`)
  d=d[upper.tri(d,diag=T)];I=I[upper.tri(I,diag=T)]
  L[1]^2*exp(-0.25*d^2/L[2]^2) +  I*L[3]^2
}

v1=c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
H=c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
n=3


zii=list()
  for(i in 1:(n-1))
  {
    zii[[i]]=cyii(v1,v1,H[c(5*i-4,5*i-3,5*n-3+i)])
  }

# Change it up a little to use 'lapply'

N <- 1:(n-1)

z2 <- lapply(N, function(i){
    cyii(v1,v1,H[c(5*i-4,5*i-3,5*n-3+i)])
})

identical(zii,z2)
#[1] TRUE