2012-07-25 17 views
39

R help spiega invisible() come "una funzione che restituisce una copia temporaneamente invisibile di un oggetto". Ho difficoltà a capire per cosa viene usato invisible(). Sareste in grado di spiegare cosa fa invisible() e quando questa funzione può essere utile?Cosa fa la funzione invisibile()?

Ho visto che invisible() è quasi sempre utilizzato nelle funzioni di metodo per print(). Ecco un esempio:

### My Method function: 
print.myPrint <- function(x, ...){ 
    print(unlist(x[1:2])) 
    invisible(x) 
} 

x = list(v1 = c(1:5), v2 = c(-1:-5)) 
class(x) = "myPrint" 
print(x) 

Stavo pensando che senza invisible(x), non sarei in grado di fare l'assegnazione del tipo:

a = print(x) 

Ma in realtà non è il caso. Quindi mi piacerebbe sapere cosa fa invisible(), dove può essere utile, e infine qual è il suo ruolo nella funzione di stampa del metodo sopra?

Grazie mille per il vostro aiuto.

+13

Posso darti una risposta ma non posso mostrartelo. – mdsumner

risposta

23

Da ?invisible:

Dettagli:

This function can be useful when it is desired to have functions 
return values which can be assigned, but which do not print when 
they are not assigned. 

in modo da poter assegnare il risultato, ma non verranno stampati se non assegnato. Viene spesso utilizzato al posto di return. Il metodo print.myPrint stampa solo perché si chiama esplicitamente print. La chiamata a invisible(x) al termine della funzione restituisce semplicemente una copia di x.

Se non è stato utilizzato invisible, x verrà stampato anche se non assegnato. Per esempio:

R> print.myPrint <- function(x, ...){ 
+ print(unlist(x[1:2])) 
+ return(x) 
+ } 
R> print(x) 
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
    1 2 3 4 5 -1 -2 -3 -4 -5 
v11 v12 v13 v14 v15 v21 v22 v23 v24 v25 
    1 2 3 4 5 -1 -2 -3 -4 -5 
7

Mentre invisible() fa il suo contenuto temporanea invisibile ed è spesso usato al posto di return() dovrebbe invece essere utilizzato in combinazione con return() e non come la sua sostituzione.

Mentre return() interromperà l'esecuzione della funzione e restituirà il valore inserito, invisible() non farà nulla del genere. Rende invisibile il suo contenuto solo per un po '.

considerare i seguenti due esempi:

f1 <- function(x){ 
    if(x > 0){ 
    invisible("bigger than 0") 
    }else{ 
    return("negative number") 
    } 
    "something went wrong" 
} 

result <- f1(1) 

result 
## [1] "something went wrong" 



f2 <- function(x){ 
    if(x > 0){ 
    return(invisible("bigger than 0")) 
    }else{ 
    return("negative number") 
    } 
} 

result <- f2(1) 

result 
## [1] "bigger than 0" 

Dopo aver aggirato invisible() s' trappola possiamo avere uno sguardo al suo funzionamento:

f2(1) 

La funzione non viene stampato il suo valore di ritorno a causa all'uso di invisible(). Essa tuttavia trasmettere il valore come al solito:

res <- f2(1) 
res 
## [1] "bigger than 0" 

invisible() 's casi d'uso sono ad esempio per evitare che i valori restituiti dalla funzione producano pagine dopo pagina di output o quando una funzione viene chiamata per il suo effetto collaterale e il valore di ritorno è ad es.usato solo per dare ulteriori informazioni ...

+1

Proveniente da altri linguaggi di programmazione, ha più senso una volta che mi rendo conto che R stampa implicitamente un sacco di cose. Considererei tale stampa un effetto collaterale e quello invisibile() non lo fa. – Chris

Problemi correlati