R 中矢量化函数内的运算

  • 本文关键字:运算 函数 矢量化 r
  • 更新时间 :
  • 英文 :


我有一个虚拟的非向量函数,它接受两个参数作为输入。我有一个类似的(不完全相同的(向量函数,适用于参数列表。

但是,在非向量函数中,我也可以对参数本身进行一些操作(请参阅带有注释的行(。我也在尝试找出一种方法来在函数的向量形式中做同样的事情。

nonvectorfunction<-function(x,i){
if (i==1){
x<-x^0.5 # not implemented in vectorfunction
if (x==10){
x<-x+1
} else {
x<-x-1
}
}
if (i==2){
x<-x^(1/3) # not implemented in vectorfunction
if (x==10){
x<-x-1
} else {
x<-x+1
}
}
return(x)
}

vectorfunction <- function(x,i) {
x <- case_when(
i==1 ~ case_when(
x==10 ~ x+1,
TRUE ~ x-1),
i==2 ~ case_when (
x==10 ~ x-1,
TRUE ~ x+1
))
return(x)
}

sample.list<-c(10,9,8,10)
nonvectorfunction(sample.list[1],1)
nonvectorfunction(sample.list[3],2)
nonvectorfunction(sample.list,1)

vectorfunction(sample.list,1)

输出:

> nonvectorfunction(sample.list[1],1)
[1] 2.162278
> nonvectorfunction(sample.list[3],2)
[1] 3
> nonvectorfunction(sample.list,1)
[1] 2.162278 2.000000 1.828427 2.162278
Warning message:
In if (x == 10) { :
the condition has length > 1 and only the first element will be used
#this is expected because I am passing a list to non vector function
> 
> vectorfunction(sample.list,1)
[1] 11  8  7 11

如上所示,矢量化函数可以很好地处理列表。

由于i只取一个值,因此它可以与if/else一起使用,也可以与switch一起使用

vectorfunction <- function(x,i) {
switch(i, 
`1` = {
x <- x^0.5
case_when(x == 10 ~ x + 1, TRUE ~ x - 1)
},
`2` = {
x <- x^(1/3)
case_when( x== 10 ~ x -1, TRUE ~ x +1)

},
default = x

)

}
vectorfunction(sample.list,1)
#[1] 2.162278 2.000000 1.828427 2.162278
vectorfunction(sample.list,2)
#[1] 3.154435 3.080084 3.000000 3.154435

nonvectorfunction比较

sapply(sample.list, nonvectorfunction, i = 1)
#[1] 2.162278 2.000000 1.828427 2.162278
sapply(sample.list, nonvectorfunction, i = 2)
#[1] 3.154435 3.080084 3.000000 3.154435

或者nonvectorfunction可以Vectorized

Vectorize(nonvectorfunction)(sample.list, i = 1)
#[1] 2.162278 2.000000 1.828427 2.162278

最新更新