Ответ 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 завершен.