2012-04-03 37 views
7

Trong R, tôi xác định chức năng lengths tùy thuộc vào giá trị của một tham số thiết lập trước đó:Sử dụng một lệnh if-else để có điều kiện xác định một hàm trong `r`

if(condition == 1){ 
    lengths <- function(vector) { 
     n <- ceiling(length(vector)/2) 
    } 
} 
else if(condition == 2){ 
    lengths <- function(vector) { 
     n <- length(vector) 
    } 
} 
else if(condition == 3){ 
    lengths <- function(vector) { 
     n <- length(vector)*2 
    } 
} 
else{ 
    lengths <- function(vector) { 
     n <- length(vector)+10 
    } 
} 

Định nghĩa một hàm có điều kiện trong cách này có vẻ hơi ... lộn xộn. Có cách nào tốt hơn?

+2

Câu hỏi về trục trặc, nhưng tại sao không có hàm 'độ dài' trong' điều kiện' làm đối số và thực hiện điều gì đó hợp lý? – csgillespie

+1

Thử '? Switch' có lẽ? – BenBarnes

Trả lời

9

Bạn có thể sử dụng switch:

lengths <- function(vector, condition) { 
    switch(condition, 
    ceiling(length(vector)/2), 
    length(vector), 
    length(vector)*2, 
    length(vector)*+10) 
} 

Chức năng này cung cấp cho hành vi giống như mã ví dụ của bạn:

lengths <- function(vector, condition) { 
    switch(as.character(condition), 
    `1`=ceiling(length(vector)/2), 
    `2`=length(vector), 
    `3`=length(vector)*2, 
    length(vector)*+10) 
} 

... và chức năng này sẽ được xác định bởi giá trị của condition:

condition <- 1 
lengths <- switch(as.character(condition), 
    `1`=function(vector) ceiling(length(vector)/2), 
    `2`=function(vector) length(vector), 
    `3`=function(vector) length(vector)*2, 
    function(vector) length(vector)*+10) 
lengths 
# function(vector) ceiling(length(vector)/2) 
0

Tấn công nhanh dựa trên đề xuất của CSGillespie:

length.lut <- cbind(c(0.5,1,2,1,),c(0,0,0,10)) 

lengths <- function(vector, condition) vector*length.lut[condition,1] + length.lut[condition,2] 
Các vấn đề liên quan