O que significa “O seguinte object é mascarado de ‘package: xxx’” significa?

Quando carrego um pacote, recebo uma mensagem informando que:

"The following object is masked from 'package:xxx' 

Por exemplo, se eu carregar o testthat seguida, assertive , recebo o seguinte:

 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 

O que essa mensagem significa e como evitá-la?

A mensagem significa que ambos os pacotes possuem funções com os mesmos nomes. Neste caso particular, os pacotes testthat e assertive contêm cinco funções com o mesmo nome.

Quando duas funções têm o mesmo nome, qual delas é chamada?

R irá procurar pelo caminho de search para encontrar funções e usará o primeiro que encontrar.

 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" 

Nesse caso, como a assertive foi carregada após o testthat , ela aparece mais cedo no caminho de pesquisa, portanto, as funções desse pacote serão usadas.

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

As funções em testthat não são acessíveis da maneira usual; isto é, eles foram mascarados .

E se eu quiser usar uma das funções mascaradas?

Você pode explicitamente fornecer um nome de pacote quando chamar uma function, usando o operador de dois pontos, :: . Por exemplo:

 testthat::is_true ## function () ## { ## function(x) expect_true(x) ## } ##  

Como suprimo a mensagem?

Se você souber sobre o confronto do nome da function e não quiser vê-lo novamente, poderá suprimir a mensagem, passando warn.conflicts = FALSE para a library .

 library(testthat) library(assertive, warn.conflicts = FALSE) # No output this time 

Como alternativa, suprima a mensagem com suppressPackageStartupMessages :

 library(testthat) suppressPackageStartupMessages(library(assertive)) # Also no output 

Impacto dos Procedimentos de Inicialização de R na Função Mascaramento

Se você alterou algumas das opções de configuração de boot do R (consulte ?Startup ), você pode experimentar um comportamento de mascaramento de function diferente do esperado. A ordem precisa que as coisas acontecem como estabelecido em ?Startup deve resolver a maioria dos mistérios.

Por exemplo, a documentação diz:

Observe que quando o site e os arquivos de perfil de usuário são originados apenas o pacote base é carregado, então os objects em outros pacotes precisam ser referenciados por, por exemplo, utils :: dump.frames ou após carregar explicitamente o pacote em questão.

O que implica que quando pacotes de terceiros são carregados via arquivos como .Rprofile você pode ver funções daqueles pacotes mascarados por aqueles em pacotes padrão como stats , ao invés do contrário, se você carregou o pacote de terceiros depois que o procedimento de boot de R foi concluído.

Como faço para listar todas as funções mascaradas?

Primeiro, obtenha um vetor de caracteres de todos os ambientes no caminho de pesquisa. Por conveniência, nomearemos cada elemento desse vetor com seu próprio valor.

 library(dplyr) envs < - search() %>% setNames(., .) 

Para cada ambiente, obtenha as funções exportadas (e outras variables).

 fns < - lapply(envs, ls) 

Transforme isso em um quadro de dados, para facilitar o uso com o dplyr.

 fns_by_env < - data_frame( env = rep.int(names(fns), lengths(fns)), fn = unlist(fns) ) 

Encontre casos em que o object aparece mais de uma vez.

 fns_by_env %>% group_by(fn) %>% tally() %>% filter(n > 1) %>% inner_join(fns_by_env) 

Para testar isso, tente carregar alguns pacotes com conflitos conhecidos (por exemplo, Hmisc , AnnotationDbi ).

Como evito bugs de conflito de nome?

O pacote conflicted gera um erro com uma mensagem de erro útil sempre que você tenta usar uma variável com um nome ambíguo.

 library(conflicted) library(Hmisc) units ## Error: units found in 2 packages. You must indicate which one you want with :: ## * Hmisc::units ## * base::units