Làm thế nào để sử dụng câu lệnh switch trong các hàm R?


81

Tôi muốn sử dụng cho hàm của mình trong câu lệnh R switch()để kích hoạt các phép tính khác nhau theo giá trị của đối số của hàm.

Ví dụ, trong Matlab, bạn có thể làm điều đó bằng cách viết

switch(AA)        
case '1'   
...   
case '2'   
...   
case '3'  
...  
end

Tôi đã tìm thấy cách sử dụng câu lệnh post - switch () này - giải thích cách sử dụng switch, nhưng không thực sự hữu ích đối với tôi vì tôi muốn thực hiện các phép tính phức tạp hơn (phép toán ma trận) và không đơn giản mean.

Câu trả lời:


112

Chà, switchcó lẽ không thực sự có ý định hoạt động như thế này, nhưng bạn có thể:

AA = 'foo'
switch(AA, 
foo={
  # case 'foo' here...
  print('foo')
},
bar={
  # case 'bar' here...
  print('bar')    
},
{
   print('default')
}
)

... mỗi trường hợp là một biểu thức - thường chỉ là một điều đơn giản, nhưng ở đây tôi sử dụng một khối xoăn để bạn có thể nhồi bất kỳ mã nào bạn muốn vào đó ...


6
có cách nào để làm điều này mà không cần so sánh với chuỗi không? điều đó dường như không hiệu quả.
Jules GM

9
Là một người dùng mới switch(), tôi tự hỏi tại sao bạn nói rằng nó không hoạt động như thế này. Bạn còn mong đợi một câu lệnh switch để làm gì nữa?
eric_kernfeld

46

những cách chuyển đổi khác nhau ...

# by index
switch(1, "one", "two")
## [1] "one"


# by index with complex expressions
switch(2, {"one"}, {"two"})
## [1] "two"


# by index with complex named expression
switch(1, foo={"one"}, bar={"two"})
## [1] "one"


# by name with complex named expression
switch("bar", foo={"one"}, bar={"two"})
## [1] "two"

42

Tôi hy vọng ví dụ này sẽ giúp. Bạn có thể sử dụng dấu ngoặc nhọn để đảm bảo rằng bạn đã có mọi thứ được bao bọc trong trình thay đổi trình chuyển đổi (xin lỗi không biết thuật ngữ kỹ thuật nhưng thuật ngữ đứng trước dấu = thay đổi điều gì xảy ra). Tôi nghĩ về switch như một loạt các if () {} else {}câu lệnh được kiểm soát nhiều hơn .

Mỗi lần chức năng chuyển đổi đều giống nhau nhưng lệnh chúng tôi cung cấp thay đổi.

do.this <- "T1"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)
#########################################################
do.this <- "T2"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)
########################################################
do.this <- "T3"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)

Đây là bên trong một hàm:

FUN <- function(df, do.this){
    switch(do.this,
        T1={X <- t(df)
            P <- colSums(df)%*%X
        },
        T2={X <- colMeans(df)
            P <- outer(X, X)
        },
        stop("Enter something that switches me!")
    )
    return(P)
}

FUN(mtcars, "T1")
FUN(mtcars, "T2")
FUN(mtcars, "T3")

0

Đây là câu trả lời tổng quát hơn cho cấu trúc "Chọn cond1, stmt1, ... else stmtelse" bị thiếu trong R. Nó hơi khó hiểu, nhưng nó hoạt động giống với câu lệnh switch có trong C

while (TRUE) {
  if (is.na(val)) {
    val <- "NULL"
    break
  }
  if (inherits(val, "POSIXct") || inherits(val, "POSIXt")) {
    val <- paste0("#",  format(val, "%Y-%m-%d %H:%M:%S"), "#")
    break
  }
  if (inherits(val, "Date")) {
    val <- paste0("#",  format(val, "%Y-%m-%d"), "#")
    break
  }
  if (is.numeric(val)) break
  val <- paste0("'", gsub("'", "''", val), "'")
  break
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.