org - r studiodio
¿Qué significa "El siguiente objeto está enmascarado de ''paquete: xxx''"? (1)
Cuando cargo un paquete, recibo un mensaje que dice que:
"The following object is masked from ''package:xxx''
Por ejemplo, si cargo
testthat
luego son
assertive
, obtengo lo siguiente:
library(testthat)
library(assertive)
## Attaching package: ‘assertive’
##
## The following objects are masked from ‘package:testthat’:
##
## has_names, is_false, is_less_than, is_null, is_true
¿Qué significa este mensaje y cómo lo evito?
El mensaje significa que ambos paquetes tienen funciones con los mismos nombres.
En este caso particular, los paquetes
testthat
y
assertive
contienen cinco funciones con el mismo nombre.
Cuando dos funciones tienen el mismo nombre, ¿cuál se llama?
R buscará en la ruta de
search
para encontrar funciones y usará la primera que encuentre.
search()
## [1] ".GlobalEnv" "package:assertive" "package:testthat"
## [4] "tools:rstudio" "package:stats" "package:graphics"
## [7] "package:grDevices" "package:utils" "package:datasets"
## [10] "package:methods" "Autoloads" "package:base"
En este caso, dado que se cargó
assertive
después de
testthat
eso, aparece antes en la ruta de búsqueda, por lo que se utilizarán las funciones en ese paquete.
is_true
## function (x, .xname = get_name_in_parent(x))
## {
## x <- coerce_to(x, "logical", .xname)
## call_and_name(function(x) {
## ok <- x & !is.na(x)
## set_cause(ok, ifelse(is.na(x), "missing", "false"))
## }, x)
## }
<bytecode: 0x0000000004fc9f10>
<environment: namespace:assertive.base>
Las funciones en las
testthat
no son accesibles de la manera habitual;
es decir, han sido
enmascarados
.
¿Qué sucede si quiero usar una de las funciones enmascaradas?
Puede proporcionar explícitamente un nombre de paquete cuando llama a una función, utilizando el operador de dos puntos,
::
.
Por ejemplo:
testthat::is_true
## function ()
## {
## function(x) expect_true(x)
## }
## <environment: namespace:testthat>
¿Cómo suprimo el mensaje?
Si conoce el choque del nombre de la función y no desea volver a verlo, puede suprimir el mensaje pasando
warn.conflicts = FALSE
a la
library
.
library(testthat)
library(assertive, warn.conflicts = FALSE)
# No output this time
Alternativamente, suprima el mensaje con
suppressPackageStartupMessages
:
library(testthat)
suppressPackageStartupMessages(library(assertive))
# Also no output
Impacto de los procedimientos de inicio de R en el enmascaramiento de funciones
Si ha modificado algunas de las opciones de configuración de inicio de R (consulte
?Startup
), puede experimentar un comportamiento de enmascaramiento de funciones diferente al que podría esperar.
El orden preciso en que las cosas suceden según lo establecido en el
?Startup
debería resolver la mayoría de los misterios.
Por ejemplo, la documentación allí dice:
Tenga en cuenta que cuando el sitio y los archivos de perfil de usuario se obtienen solo se carga el paquete base, por lo que los objetos en otros paquetes deben ser consultados, por ejemplo, utils :: dump.frames o después de cargar explícitamente el paquete en cuestión.
Lo que implica que cuando los paquetes de terceros se cargan a través de archivos como
.Rprofile
, puede ver funciones de esos paquetes enmascarados por aquellos en paquetes predeterminados como
estadísticas
, en lugar de lo contrario, si cargó el paquete de terceros después de que se complete el procedimiento de inicio de R.
¿Cómo enumero todas las funciones enmascaradas?
Primero, obtenga un vector de caracteres de todos los entornos en la ruta de búsqueda. Por conveniencia, nombraremos cada elemento de este vector con su propio valor.
library(dplyr)
envs <- search() %>% setNames(., .)
Para cada entorno, obtenga las funciones exportadas (y otras variables).
fns <- lapply(envs, ls)
Convierta esto en un marco de datos, para un uso fácil con dplyr.
fns_by_env <- data_frame(
env = rep.int(names(fns), lengths(fns)),
fn = unlist(fns)
)
Encuentra casos en los que el objeto aparece más de una vez.
fns_by_env %>%
group_by(fn) %>%
tally() %>%
filter(n > 1) %>%
inner_join(fns_by_env)
Para probar esto, intente cargar algunos paquetes con conflictos conocidos (por ejemplo,
Hmisc
,
AnnotationDbi
).
¿Cómo evito errores de conflicto de nombres?
El paquete en
conflicted
arroja un error con un mensaje de error útil, siempre que intente utilizar una variable con un nombre ambiguo.
library(conflicted)
library(Hmisc)
units
## Error: units found in 2 packages. You must indicate which one you want with ::
## * Hmisc::units
## * base::units