2017-01-08 4 views
1

ich frage, wie die abline erhalten() Befehl in der R Code unten2 vertikaleLinien zu zeichnenIF tl == 2 und nur 1 vertikale LinieIF tl == 1 mit der gleichen Linienfarbe (zB "grün")?ifelse in abline() r

Hier ist mein R-Code (ohne Erfolg):

CBT <- function(g,r,n,tl){ 

curve(dt(x,n),-5,6,col="red") 

abline(v=ifelse(tl==2,c(-2,2),2),col="green") ## HERE needs a fix?? 
} 

## Test this: 
CBT(.4,.05,20,2) 

Antwort

2

Wir haben eine if/else Bedingung

CBT <- function(g,r,n,tl){ 
curve(dt(x,n),-5,6,col="red") 
if(tl==2){ 
    abline(v=c(-2,2), col="green") 
    } else { 
    abline(v = 2, col="green") } 
} 

CBT(.4,.05,20,2) 
können

Wenn wir für 1 sowohl die Bedingung heißt 'tl' benötigen, 2 und andere Fälle

CBT <- function(g,r,n,tl){ 
curve(dt(x,n),-5,6,col="red") 
if(tl==2){ 
    abline(v=c(-2,2), col="green") 
    } else if(tl==1){ 
    abline(v = 2, col="green") 
} else {abline(v=NA)} 
} 

CBT(.4,.05,20,2) 
CBT(.4,.05,20,1) 
CBT(.4,.05,20,0) 
+0

@parvinkarimi Ich würde 'if/else' Bedingung für Bedingungen basierend auf einem einzelnen Element verwenden. Ich denke, es gibt eine andere Antwort, die das 'ifelse' zeigte. Wenn wir in Ihrem Beitrag die 'ifelse'-Bedingung betrachten:' tl == 2, c (-2,2) 'hat der logische Index die Länge 1, während die WAHR-Bedingung die Länge 2 ist (' c (-2,2) '). SO ist es besser, die zweite in eine "Liste" zu setzen – akrun

2

Sie können eineverwendenAufruf, der einen Index in eine Liste mit geeigneten Werten für Ihre beiden Bedingungen zurückgibt.

CBT <- function(g,r,n,tl){ 
     curve(dt(x,n),-5,6,col="red") 
     abline(v= list(c(-2,2), 2) [[ ifelse(tl==2, 1, 2)]], col="green") 
    } 
CBT(.4,.05,20,1.5) 

Ich denke, das Problem mit dem Versuch ifelse Weg zu verwenden, ist, dass ifelse soll einen Wert mit der gleichen Länge wie die bedingten zurückzukehren. Wenn Sie als Index verwenden, können Sie die Längen variieren.

+0

@ 42-Vielen Dank, es scheint die gleiche Logik kann nicht auf 'points()' Befehl, richtig? Zum Beispiel: 'Punkte (Liste (c (-2,2), 2) [[ifelse (tl == 2,1,2)]], -. 017, bg =" grün ", col =" grün ", pch = 21, cex = 1, xpd = T) ' – rnorouzian

+0

' Punkte' könnten mitkommen, aber da Sie sowohl ein x- als auch ein y-Argument angeben müssen, könnten Sie eine Argumentliste mit 'do.call' an' points' übergeben. Oder Sie könnten eine "ifelse" für den x-Wert und eine andere für den y-Wert haben –

Verwandte Themen