r - क्या टर्नरी ऑपरेटर आर में मौजूद है?




operators (5)

आपका लिंक एक कथन पर इंगित करता है।

> x <- 1
> if(x < 2) print("Less than") else print("Greater than")
[1] "Less than"

यदि आपका इनपुट वैरिएबल एक वेक्टर है, तो ifelse अधिक उपयुक्त हो सकता है:

> x <- 1:3
> ifelse(x<=2, "Less than or equal", "Greater than")
[1] "Less than or equal" "Less than or equal" "Greater than"   

if सहायता के लिए सहायता पृष्ठ तक पहुंचने के लिए, आपको बैकटिक्स में एम्बेड करना if :

?`if`

ifelse लिए सहायता पृष्ठ ifelse है:

`?ifelse`

जैसा कि सवाल पूछता है, क्या सी में टर्नरी ऑपरेटर के समान आर में नियंत्रण अनुक्रम है? यदि हां, तो आप इसका उपयोग कैसे करते हैं? धन्यवाद!


एक शरारत के रूप में, आप फिर से परिभाषित कर सकते हैं ? ऑपरेटर (लगभग) टर्नरी ऑपरेटर की तरह काम करता है (यह एक खराब आईडीईए है):

`?` <- function(x, y) { y <-substitute(y); if(x) eval(y[[2]], parent.frame()) else eval(y[[3]], parent.frame()) }

x <- 1:3
length(x) ? (x*2) : 0
x <- numeric(0)
length(x) ? (x*2) : 0

for(i in 1:5) cat(i, (i %% 2) ? "Odd\n" : "Even\n")

... लेकिन आपको अभिव्यक्तियों को कोष्ठक में रखना होगा क्योंकि डिफ़ॉल्ट प्राथमिकता सी में नहीं है।

जब आप खेल रहे हों तो पुरानी सहायता फ़ंक्शन को पुनर्स्थापित करना याद रखें:

rm(`?`)

मैं ifelse कमांड पर एक नज़र ifelse । मैं इसे और भी बेहतर कहूंगा क्योंकि यह भी सदिश है। कार डेटासेट का उपयोग कर एक उदाहरण:

> cars$speed > 20
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
[49]  TRUE  TRUE

> ifelse(cars$speed > 20, 'fast', 'slow')
 [1] "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow"
[11] "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow"
[21] "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow"
[31] "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow" "slow"
[41] "slow" "slow" "slow" "fast" "fast" "fast" "fast" "fast" "fast" "fast"

यह स्पष्ट रूप से मौजूद नहीं है, लेकिन आप कर सकते हैं:

set.seed(21)
y <- 1:10
z <- rnorm(10)

condition1 <- TRUE
x1 <- if(condition1) y else z

या

condition2 <- sample(c(TRUE,FALSE),10,TRUE)
x2 <- ifelse(condition2, y, z)

दोनों के बीच का अंतर यह है कि condition1 1 लंबाई 1 का लॉजिकल वेक्टर होना चाहिए, जबकि condition2 एक तार्किक वेक्टर होना चाहिए जो x , y , और z के समान लंबाई हो। पहला y या z (संपूर्ण ऑब्जेक्ट) वापस करेगा, जबकि दूसरा y ( condition2==TRUE ) या z ( condition2==FALSE ) के संबंधित तत्व को वापस करेगा।

यह भी ध्यान रखें कि ifelse if / condition से धीमा हो जाएगा, तो condition , y , और z लंबाई 1 के साथ सभी वैक्टर हैं।


if अनचाहे ifelse की तरह काम करता है अगर निम्न तरीके से उपयोग किया जाता है:

`if`(condition, doIfTrue, doIfFalse)

Ifelse पर इसका उपयोग करने का लाभ तब होता है जब वेक्टरिसेशन रास्ते में होता है (यानी मेरे परिणामस्वरूप स्केलर बूलियन और सूची / वेक्टर चीजें होती हैं)

ifelse(TRUE, c(1,2), c(3,4))
[1] 1
`if`(TRUE, c(1,2), c(3,4))
[1] 1 2






operators