आर फ़ंक्शन में स्विच स्टेटमेंट का उपयोग कैसे करें?


81

मैं switch()फ़ंक्शन के तर्क के मान के अनुसार विभिन्न गणना को ट्रिगर करने के लिए आर में अपने फ़ंक्शन के लिए उपयोग करना चाहता हूं ।

उदाहरण के लिए, मतलाब में आप ऐसा लिखकर कर सकते हैं

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

मुझे यह पोस्ट - स्विच () स्टेटमेंट उपयोग - मिला, जो बताता है कि कैसे उपयोग करना है switch, लेकिन वास्तव में मेरे लिए उपयोगी नहीं है क्योंकि मैं अधिक परिष्कृत गणना (मैट्रिक्स संचालन) करना चाहता हूं और सरल नहीं mean

जवाबों:


112

ठीक है, switchशायद वास्तव में इस तरह से काम करने के लिए नहीं था, लेकिन आप कर सकते हैं:

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

... प्रत्येक मामला एक अभिव्यक्ति है - आमतौर पर सिर्फ एक साधारण बात है, लेकिन यहां मैं एक घुंघराले-ब्लॉक का उपयोग करता हूं ताकि आप वहां जो भी कोड चाहते हैं उसे भर सकें ...


6
वहाँ तार करने के लिए तुलना के बिना ऐसा करने का एक तरीका है? यह व्यापक रूप से अक्षम लगता है।
जूल्स जीएम

10
के एक नए उपयोगकर्ता के रूप में switch(), मुझे आश्चर्य है कि आप क्यों कहते हैं कि यह इस तरह काम करने के लिए नहीं है। आप स्विच स्टेटमेंट को और क्या करने की उम्मीद करेंगे?
इरीक_कर्नफेल्ड

46

स्विच के उन विभिन्न तरीकों ...

# 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

मुझे उम्मीद है कि यह उदाहरण मदद करता है। आप घुंघराले ब्रेसिज़ का उपयोग यह सुनिश्चित करने के लिए करते हैं कि आपको स्विचर चेंजर लड़के में संलग्न सब कुछ मिल गया है (खेद है कि तकनीकी शब्द नहीं जानते हैं लेकिन यह शब्द = जो उस परिवर्तन को दर्शाता है जो परिवर्तन होता है)। मैं if () {} else {}बयानों के अधिक नियंत्रित गुच्छा के रूप में स्विच करने के बारे में सोचता हूं ।

हर बार स्विच फंक्शन समान होता है लेकिन हम जिस कमांड में बदलाव करते हैं।

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!")
)

यहाँ यह एक फंक्शन के अंदर है:

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

यह लापता "सेलेक्ट 1, एसटीएमटी 1, ... वरना स्टमटेलसे" का आर में एक अधिक सामान्य उत्तर है। आर। यह थोड़ा सा है, लेकिन यह सी में मौजूद स्विच स्टेटमेंट जैसा दिखता है।

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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.