2014-12-03 14 views
6

Tôi mới tham gia lập trình R. Tôi không biết liệu chúng ta có thể sử dụng câu lệnh chuyển đổi cho các đối tượng số không.Báo cáo chuyển đổi không hoạt động đối với các đối tượng số

Đây là mã của tôi,

myfunction <- function() { 
    x <- 10 
    switch(x, 
     1={ 
      print("one") 
     }, 
     2={ 
      print("two") 
     }, 
     3={ 
      print("three") 
     }, 
     { 
      print("default")  #Edited one.. 
     } 
    ) 
} 

Tôi đã nhận lỗi này,

test.R:4:18: unexpected '=' 
3:   switch(x, 
4:     1= 
        ^

Xin hãy giúp tôi ra khỏi vấn đề này.

Trả lời

6
myfunction <- function(x) { 
         switch(x, 
           print("one"), 
           print("two"), 
           print("three"))} 

myfunction(1) 
## [1] "one" 

Edit: Như đã đề cập trong ý kiến, phương pháp này không được đánh giá các giá trị đang được nhập vào, thay vì sử dụng chúng như một chỉ mục. Vì vậy, nó hoạt động trong trường hợp của bạn nhưng nó sẽ không hoạt động nếu các câu lệnh được sắp xếp lại (xem @Joshs trả lời cho cách tiếp cận tốt hơn). Dù bằng cách nào, tôi không nghĩ rằng switch là chức năng phù hợp để sử dụng trong trường hợp này, vì nó chủ yếu có nghĩa là để chuyển đổi giữa các lựa chọn thay thế khác nhau, trong khi trong trường hợp của bạn, về cơ bản bạn đang chạy cùng một chức năng lặp đi lặp lại. Do đó, việc thêm một câu lệnh cho mỗi phương án thay thế có vẻ như quá nhiều công việc (ví dụ, nếu bạn muốn hiển thị 20 số khác nhau, bạn sẽ phải viết 20 câu lệnh khác nhau).

Thay vào đó, bạn có thể thử các english gói mà sẽ cho phép bạn hiển thị càng nhiều con số như bạn sẽ xác định trong báo cáo ifelse

library(english) 
myfunction2 <- function(x) { 
       ifelse(x %in% 1:3, 
         as.character(as.english(x)), 
         "default")} 
myfunction2(1) 
## [1] "one" 
myfunction2(4) 
## [1] "default" 

Ngoài ra, bạn cũng có thể tránh sử dụng switch (mặc dù không nhất thiết phải đề nghị) bằng cách sử dụng match

myfunction3 <- function(x) { 
    df <- data.frame(A = 1:3, B = c("one", "two", "three"), stringsAsFactors = FALSE) 
     ifelse(x %in% 1:3, 
      df$B[match(x, df$A)], 
      "default")} 
myfunction3(1) 
## [1] "one" 
myfunction3(4) 
## [1] "default" 
+0

Nếu bạn không nhớ cho tôi biết làm thế nào để thêm mặc định cho tuyên bố chuyển đổi này? – Venkatesh

+0

Thay vì 'function (x)' do 'function (x = 1)', ví dụ (nếu bạn muốn 1 là mặc định của bạn). Bạn cũng có thể xóa tất cả các tên và chỉ cần đặt 'chuyển đổi (x, {print (" one ")}, {print (" two ")}, {print (" ba ")} )' (wihtout the tên) như MrFlick đã đề cập –

+0

Tôi nghĩ rằng tôi không rõ ràng với câu hỏi của tôi. Xin lỗi vì chuyện đó. Tôi muốn cung cấp cho trường hợp mặc định cho trường hợp chuyển đổi của tôi, làm thế nào tôi sẽ làm điều đó? – Venkatesh

2

tôi sẽ khuyên bạn nên đọc trang ?switch giúp đỡ. Điều này có vẻ khá được mô tả ở đó. Các tên trong R không bao giờ có thể là số, nghĩa là c (1 = 5) không được phép, cũng không phải là f (1 = 5, 2 = 5). Nếu bạn thực sự có 1,2 hoặc 3, sau đó bạn muốn chỉ

switch(x, 
    {print("one")}, 
    {print("two")}, 
    {print("three")} 
) 

(bỏ qua những cái tên cho giá trị số)

8

Để tận dụng đầy đủ các chức năng switch 's (đặc biệt là khả năng xử lý tùy tiện các giá trị có biểu thức "mặc định" cuối cùng) để xử lý các số khác 1,2,3, ..., bạn nên chuyển đổi bất kỳ đầu vào nào thành chuỗi ký tự.

tôi sẽ làm một cái gì đó như thế này:

myfunction <- function(x) { 
    switch(as.character(x), 
     "1" = print("one"), 
     "2" = print("two"), 
     "3" = print("three"), 
     print("something other than 'one', 'two', or 'three'")) 
} 

myfunction(1) 
# [1] "one" 
myfunction(345) 
# [1] "something other than 'one', 'two', or 'three'" 
Các vấn đề liên quan