使用 lapply 中輸入list , 如果自己編寫的函數中存在 if 判斷語句,會導致有時候會報錯,舉例子如下:
> rm(list=ls())
> Test <- function(x){
+ if(x == 1){
+ y = x+1
+ }else{
+ y = x+2
+ }
+ }
>
> Data1 = list(c(1,2,3))
> lapply(Data1,Test)
[[1]]
[1] 2 3 4
Warning message:
In if (x == 1) { :
the condition has length > 1 and only the first element will be used
>
> # 解決方法1
> Data2 = list(c(1,2,3))
> lapply(Data2[[1]],Test)
[[1]]
[1] 2
[[2]]
[1] 4
[[3]]
[1] 5
>
>
> # 解決方法2
> Data3 = c(1,2,3)
> lapply(Data3,Test)
[[1]]
[1] 2
[[2]]
[1] 4
[[3]]
[1] 5
>
>
> # 解決方法3,使用 ifelse 函數,這個就要修改原始的函數了
> Test2 <- function(x){
+ y = ifelse(x==1,x+1,x+2)
+ }
> lapply(Data1,Test2)
[[1]]
[1] 2 4 5
>
> # 如果ifelse 的語句有多個輸出結果可以使用 list 函數進行連接
> Test3 <- function(x){
+ y <- ifelse(x==1,list(c(x+1,x+2,x+3)),0)
+ }
> lapply(Data1[[1]],Test3)
[[1]]
[[1]][[1]]
[1] 2 3 4
[[2]]
[1] 0
[[3]]
[1] 0
