2015-07-21 15 views
10

Có thể cung cấp một loại danh sách các giá trị có thể cho hàm switch của tôi không. Tôi muốn giữ mọi thứ tự động cập nhật, nếu ai đó cung cấp thông số sai.sử dụng danh sách các giá trị có thể có trong lệnh chuyển đổi

Tôi sử dụng {} cho từng điều kiện, bởi vì tôi sẽ thực thi thêm sau đó chỉ khai báo biến này trong hàm của tôi, tôi sẽ thực hiện một số việc trong chuyển đổi này.

switch(con, 
     val1={ 
     filename <- 'SILAC-DML_with_PDF.R' 
     }, 
     val2={ 
     filename <- 'SILAC-DML_with_PDF.R' 
     }, 
     stop(sprintf('"%s" is an unknown condition type, please use one of "%s".\n', 
        con, paste(c('val1','val2'), collapse=', ')))) 

Tôi rất muốn có thứ gì đó giống như danh sách mà tôi có thể chỉ dán tên để nhận các giá trị có thể. Vì vậy, giải pháp lý tưởng muốn có một chút như thế này, nhưng không có một thông báo lỗi :-)

my_list <- list(val1=filename <- 'a.R', 
       val2=filename <- 'b.R') 
switch(con, 
     my_list, 
     stop(sprintf('"%s" is an unknown condition type, please use one of "%s".\n', 
        con, names(my_list), collapse=', ')))) 

Trả lời

9

Chức năng switch là không cần thiết, bạn chỉ có thể tập hợp con một danh sách các giá trị trực tiếp:

alternatives = list(val1 = 'SILAC-DML_with_PDF.R', 
        val2 = 'SILAC-DML_with_PDF.R') 
result = alternatives[[con]] 
if (is.null(result)) 
    stop(…) 

switch là một con quái vật kỳ lạ trong R. Tôi chưa bao giờ thực sự thấy nó hữu ích.

Nếu bạn cần hành động phức tạp hơn sẽ được thực hiện, xem xét sử dụng một danh sách các chức năng:

alternatives = list(
    val1 = function() { message('foo') }, 
    val2 = function() { message('bar') } 
) 

if (! con %in% names(alternatives)) 
    stop(…) 
result = alternatives[[con]]() 

Tôi không nghĩ rằng đây có thể đạt được thông minh với switch nhưng nó có thể đương nhiên được bao bọc vào riêng của mình chức năng nhỏ. Lưu ý rằng không giống như câu trả lời của Hadley, tất cả các bên trên tránh trùng khớp tên đối số một phần, đó là một nguồn lỗi lớn và thuộc về bị trục xuất khỏi mặt Trái Đất.

+0

Hiện tại tôi chỉ xác định biến trong một trong các điều kiện, nhưng sau đó trong tập lệnh, tôi sẽ thực hiện nhiều việc hơn trong chuyển đổi hoặc ít nhất là kế hoạch của tôi :-) Đây là lý do tôi sử dụng cấu trúc kỳ lạ này, nhưng giải pháp của bạn cũng thú vị. – drmariod

+0

@drmariod Ah, nhận xét hợp lệ. Trong trường hợp đó, tôi khuyên bạn nên sử dụng danh sách các hàm và đặt giá thầu. –

+0

vì vậy chỉ cần gọi hàm trong danh sách ?! Hm, nghe như một giải pháp mà tôi đang tìm kiếm ... Tôi đã cập nhật câu hỏi của mình một chút. – drmariod

3

Thay vì chuyển đổi, bạn có thể sử dụng match.arg() và Subsetting:

filenames <- c(
    val1 = "a.R", 
    val2 = "b.R" 
) 
con <- match.arg(con, names(filenames)) 

filename <- filenames[[con]] 

Lưu ý rằng điều này cho phép kết hợp một phần của con, mà có thể hoặc không có thể hữu ích đối với trường hợp sử dụng của bạn.

+0

Tôi đã cập nhật câu hỏi của mình một chút. tên tập tin chỉ là một trình giữ chỗ, tôi sẽ thực hiện nhiều lệnh hơn trong các công tắc. – drmariod

+0

Uh, câu trả lời đầu tiên của tôi bởi @hadley ... Tôi cảm thấy vinh dự :-) – drmariod

Các vấn đề liên quan