2012-07-25 25 views
39

R help explica invisible() como "una función que devuelve una copia temporalmente invisible de un objeto". Tengo dificultades para entender para qué se usa invisible(). ¿Sería capaz de explicar lo que hace invisible() y cuando esta función puede ser útil?¿Qué hace la función invisible()?

He visto que invisible() casi siempre se utiliza en las funciones de método para print(). Aquí está un ejemplo:

### 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) 

Estaba pensando que sin invisible(x), yo no sería capaz de hacer misiones como:

a = print(x) 

Pero no es realmente el caso. Entonces, me gustaría saber qué hace invisible(), dónde puede ser útil, y finalmente cuál es su función en la función de impresión de métodos anterior?

Muchas gracias por su ayuda.

+13

Puedo darle una respuesta, pero no se la puedo mostrar. – mdsumner

Respuesta

23

De ?invisible:

Detalles:

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. 

lo que puede asignar el resultado, pero no se imprimirá si no se asignan. A menudo se usa en lugar de return. Su método print.myPrint solo se imprime porque llama explícitamente al print. La llamada al invisible(x) al final de su función simplemente devuelve una copia de x.

Si no usó invisible, x también se imprimiría si no se asignara. Por ejemplo:

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

Mientras invisible() hace invisible su contenido temporal y se utiliza a menudo en lugar de return() más bien se debe utilizar en combinación con return() y no como su reemplazo.

Mientras return() detendrá la ejecución de la función y devolverá el valor introducido en ella, invisible() no hará tal cosa. Solo hace que su contenido sea invisible por un tiempo.

Considere los dos ejemplos siguientes:

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" 

Habiendo eludan invisible() 'trampa s podemos echar un vistazo a su trabajo:

f2(1) 

La función no se imprime su valor de retorno debido al uso de invisible(). Sin embargo, sí transmitir el valor como de costumbre:

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

invisible() 's casos de uso son, por ejemplo, para evitar valores de retorno de función que producirían página tras página de salida o cuando se solicita una función para su efecto secundario y el valor de retorno es, por ejemplo,solo se usa para dar más información ...

+1

Viniendo de otros lenguajes de programación, tiene más sentido una vez que me doy cuenta de que R imprime muchas cosas implícitamente. Consideraría tal impresión como un efecto secundario y eso invisible() hace que no haga eso. – Chris