Это в основном не ответ на ваш главный вопрос. В этом вопросе, однако, я согласен с Дирком: есть только одна функция sd()
, и к ней можно получить доступ, в зависимости от обстоятельств, разными путями видимости Например, когда вы набираете sd(x)
в командной строке, функция, соответствующая имени sd
, будет найдена через ее запись в кадре среды package:stats
. Когда вы набираете stats:::sd(x)
или когда другая функция в пакете stats
вызывает sd(x)
, она будет найдена с помощью поиска в среде namespace:stats
.
Вместо этого я просто хотел подчеркнуть, что ваш пример, использующий test1()
и test2()
, на самом деле ничего не подразумевает в «равенстве ссылок» объектов, которые оцениваются как identical
. Чтобы увидеть истинную причину, по которой эти двое не identical
, взгляните на их структуру, показанную str()
:
test1 <- function() {}
test2 <- function() {}
identical( test1 , test2 )
# [1] FALSE
str(test1)
# function ()
# - attr(*, "srcref")=Class 'srcref' atomic [1:8] 1 13 1 25 13 25 1 1
# .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x01613f54>
str(test2)
# function ()
# - attr(*, "srcref")=Class 'srcref' atomic [1:8] 1 13 1 25 13 25 1 1
# .. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x01615730>
Если вы перейдете к правой стороне поля кода выше, вы увидите, что две функции отличаются по одному из своих атрибутов, а именно, среде, связанной с их исходными файлами. (Я не знаю много об этом атрибуте, но это не очень важно здесь. Дело в том, что они не identical
!)
Если вы скажете R, что не хотите хранить данные атрибутов исходного файла для каждой созданной функции, «неожиданное» поведение identical(test1, test2)
исчезнет:
options(keep.source=FALSE)
test1 <- function() {}
test2 <- function() {}
identical( test1 , test2 )
# [1] TRUE