Подтвердить что ты не робот

Что означает "Следующий объект замаскирован из" package: xxx "?

Когда я загружаю пакет, я получаю сообщение о том, что:

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

Например, если я загружаю testthat, тогда assertive, я получаю следующее:

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

Что означает это сообщение и как его предотвратить?

4b9b3361

Ответ 1

Сообщение означает, что оба пакета имеют функции с одинаковыми именами. В этом конкретном случае пакеты testthat и assertive содержат пять функций с тем же именем.

Когда две функции имеют одно и то же имя, которое вызывается?

R просмотрит путь search для поиска функций и будет использовать первый, который он найдет.

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"

В этом случае, поскольку assertive был загружен после testthat, он появляется раньше в пути поиска, поэтому будут использоваться функции в этом пакете.

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>

Функции в testthat недоступны обычным способом; то есть они были замаскированы.

Что делать, если я хочу использовать одну из скрытых функций?

Вы можете явно указывать имя пакета при вызове функции, используя оператор двойной двоеточия, ::. Например:

testthat::is_true
## function () 
## {
##     function(x) expect_true(x)
## }
## <environment: namespace:testthat>

Как подавить сообщение?

Если вы знаете о конфликте имени функции и не хотите видеть его снова, вы можете подавить сообщение, передав warn.conflicts = FALSE в library.

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

Альтернативно, подавляйте сообщение с помощью suppressPackageStartupMessages:

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

Влияние процедур запуска R на функциональную маскировку

Если вы изменили некоторые параметры конфигурации запуска R (см. ?Startup), у вас может возникнуть другое поведение маскировки функций, чем вы могли бы ожидать. Точный порядок, в котором все происходит, как описано в ?Startup, должен решить большинство тайн.

Например, в документации там говорится:

Обратите внимание, что когда файлы сайта и файла профиля получают только загружается базовый пакет, поэтому объекты в других пакетах должны быть упоминаемый, например, utils:: dump.frames или после явной загрузки пакет.

Это означает, что, когда пакеты сторонних производителей загружаются через такие файлы, как .Rprofile, вы можете видеть функции из тех пакетов, которые маскируются теми пакетами по умолчанию, которые используются как статистика, а не наоборот, если вы загрузили Пакет сторонних поставщиков после процедуры запуска R завершен.