2011-11-01 21 views
38

Tôi có một chức năng f rằng có hai tham số (p1p2):Kiểm tra xem một cuộc tranh cãi của một hàm được thiết lập hay không trong R

Nếu cho tham số p2 không có giá trị được truyền cho hàm, giá trị của p1^2 nên được sử dụng thay thế. Nhưng làm thế nào tôi có thể tìm ra trong hàm, nếu một giá trị được đưa ra hay không. Vấn đề là biến số p2 không được khởi tạo nếu không có giá trị. Vì vậy, tôi không thể kiểm tra cho p2NULL.

f <- function(p1, p2) { 
    if(is.null(p2)) { 
     p2=p1^2 
    } 
    p1-p2 
} 

Bằng cách nào đó bạn có thể kiểm tra xem giá trị cho p2 có được chuyển đến hàm hay không? (Tôi không thể tìm thấy isset() - chức năng hoặc những thứ tương tự.)

Trả lời

46

Bạn sử dụng chức năng missing() cho điều đó.

f <- function(p1, p2) { 
    if(missing(p2)) { 
     p2=p1^2 
    } 
    p1-p2 
} 

Hoặc, bạn có thể đặt giá trị của p2 thành NULL theo mặc định. Đôi khi tôi thích giải pháp đó, vì nó cho phép chuyển các đối số đến các hàm lồng nhau.

f <- function(p1, p2=NULL) { 
    if(is.null(p2)) { 
     p2=p1^2 
    } 
    p1-p2 
} 

f.wrapper <-function(p1,p2=NULL){ 
    p1 <- 2*p1 
    f(p1,p2) 
} 
> f.wrapper(1) 
[1] -2 
> f.wrapper(1,3) 
[1] -1 

EDIT: bạn có thể làm điều này về mặt kỹ thuật với missing() là tốt, nhưng sau đó bạn sẽ phải bao gồm một tuyên bố missing() trong f.wrapper là tốt.

+1

1 cho môi trường 'thay thế mặc định NULL'. Re: EDIT bạn thêm vào, làm thế nào bạn sẽ vượt qua 'missing''ness xuống thông qua các chức năng wrapper? –

+0

@ JoshO'Brien Vượt qua 'mất tích'-ness trên là phức tạp AFAIK - nhưng có thể. Đó là lý do tại sao 'NULL' dễ dàng hơn nhiều trong trường hợp này. – Tommy

+0

... Vì vậy, một câu hỏi riêng biệt có thể được đảm bảo cho việc truyền 'thiếu'-ness lên. – Tommy

7

Tôi nghĩ '? Thiếu' nên làm điều đó.

5

Trong một trường hợp như thế này, bạn cũng có thể sử dụng một cái gì đó như thế này:

f <- function(p1, p2 = p1^2) { 
    p1-p2 
} 

Xem phần trên đánh giá Lazy tại http://adv-r.had.co.nz/Functions.html