2015-07-25 24 views
10

mi chiedo perché ifelse(1<2,print("true"),print("false")) rendimenti`funzione print` in` ifelse`

[1] "true" 
[1] "true" 

mentre ifelse(1<2,"true","false") rendimenti

[1] "true" 

non capisco il motivo per cui i print all'interno ifelse rendimenti "true" due volte

+3

probabilmente correlate al [questo] (http://stackoverflow.com/questions/16275149/does-ifelse-really-calculate-both-of-its- vettori in ogni-tempo-è-da-lento/16.275.201 # 16.275.201). – MichaelChirico

+1

nota anche che 'ifelse' è progettato per essere applicato ai vettori, non agli scalari, quindi forse stai meglio usando' if (1 <2) print ("true") else print ("false") 'comunque. – MichaelChirico

+3

E nota che se lo assegni, come 'z <- ifelse (1 <2, print (" true "), print (" false "))', il nuovo oggetto manterrà il risultato corretto. – ulfelder

risposta

-1

Non sta stampando TRUE e restituendo TRUE allo stesso tempo?

Così, per esempio usando cat invece di stampa avrebbe cambiato l'uscita ...

questo è fondamentalmente legato alla ulfelders commento.

+0

mmm usa 'cat' genererà un messaggio di errore e un avvertimento perché interpreta il suo argomento; prova 'ifelse (1 <2, cat (" true "), cat (" false "))'. – SabDeM

12

Ciò accade perché ifelse restituirà sempre un valore. Quando si esegue ifelse(1<2,print("true"),print("false")), viene selezionata la condizione yes. Questa condizione è una chiamata alla funzione per stampare "true" sulla console, e così fa.

Ma la funzione print() restituisce anche il suo argomento, ma in modo invisibile (ad esempio i compiti, ad esempio), altrimenti in alcuni casi il valore verrà stampato due volte. Quando viene valutata l'espressione yes, il risultato è ciò che restituisce ifelse e ifelse non restituisce in modo invisibile, quindi stampa il risultato, poiché è stato eseguito nell'ambiente globale e senza assegnazione.

Possiamo testare alcune variazioni e verificare cosa sta succedendo.

> result <- print("true") 
[1] "true" # Prints because the print() function was called. 
> result 
[1] "true" # The print function return its argument, which was assigned to the variable. 

> ifelse(1<2, {print("true");"TRUE"},print("false")) 
[1] "true" #This was printed because print() was called 
[1] "TRUE" #This was printed because it was the value returned from the yes argument 

Se assegniamo questa ifelse()

> result <- ifelse(1<2, {print("true");"TRUE"},print("false")) 
[1] "true" 
> result 
[1] "TRUE" 

Possiamo anche guardare il caso in cui entrambe le condizioni condizioni vengono valutate:

> ifelse(c(1,3)<2, {print("true");"TRUE"},{print("false");"FALSE"}) 
[1] "true" # The yes argument prints this 
[1] "false" # The no argument prints this 
[1] "TRUE" "FALSE" # This is the returned output from ifelse() 

si dovrebbe usare ifelse per creare un nuovo oggetto, non eseguire azioni in base a una condizione. Per questo, utilizzare ifelse. The R Inferno ha una buona sezione (3.2) sulla differenza tra i due.

1

Solo per aggiungere alcuni argomenti alla risposta eccellente di Molx. Uno dei motivi per cui ciò accade si basa su questo:

length(print("true")) 
[1] "true" 
[1] 1 
length(length(print("true"))) 
[1] "true" 
[1] 1 
length(length(length(print("true")))) 
[1] "true" 
[1] 1 

... e così via ...

Nel manuale R si afferma che:

valori di ritorno sì per i veri elementi di prova

nota i valori, e non valore, qui si hanno due valori: uno è l'oggetto della funzione di stampa (che deve stampare "true", molto probabilmente è una chiamata a una funzione, in questo caso print, che ha come risultato un vettore di caratteri con true) e un altro è l'output pr int "true" che è l'elemento corretto dell'istruzione ifelse.

Potrebbe essere evitato con solo:

ifelse(1 < 2, "true" , "false") 
[1] "true" 
+0

Grazie mille per il voto negativo. Come sempre mai un commento segue un voto negativo. – SabDeM

+0

Questa parte non è corretta: * qui abbiamo due valori: uno è l'oggetto della funzione di stampa (che deve stampare "true") e un altro è quello di stampare "true". * Quello che hai ci sono due diversi vettori , un elemento ciascuno, il secondo è il ** solo ** risultato di 'ifelse()'. Il primo è solo il risultato di 'print()', e non fa parte del risultato di 'ifelse()'. –

+0

@RichardScriven Ho modificato la domanda, ora penso che sia più chiara. La nostra idea è la stessa forse non l'ho scritta chiaramente. So che ora è chiaro. – SabDeM