2012-05-09 2 views
4

Я пытаюсь выяснить, как R UseMethod находит метод, как только он выясняет, что его ищет (т.е. функция MyGeneric (x), вызванная с x класса MyClass: MyGeneric.MyClass) В частности, в каких средах?Путаница о методе поиска UseMethod

Я прочитал раздел «5.3 Метод диспетчеризации» и «5.4 UseMethod» руководства R Language Manual, который не определяет механизм поиска. Страница R-Help для UseMethod дает подсказку:

...UseMethod and NextMethod search for methods in two places: 
first in the environment in which the generic function is called, 
and then in the registration data base for the environment 
in which the generic is defined (typically a namespace) 

Но это не добавляет (в моей голове =). Вот конкретный пример:

library(xts) 
as.matrix # shows UseMethod("as.matrix") 
methods("as.matrix") # shows as.matrix.xts. * indicates non-visible 
showMethods("as.matrix") # says <not an S4 generic function> 
data(sample_matrix) 
as.matrix(as.xts(sample_matrix)) # how does R find as.matrix.xts?? its not exported! 

as.matrix определяется в namespace:base. Если R должен был использовать эту среду или вызывающую среду (R_GlobalEnv), он не смог найти as.matrix.xts, потому что ее не экспортировали. Вызывающая среда, похоже, работает, если функция внутри xts вызывает as.matrix, потому что as.matrix.xts будет в вызывающей среде. Что мне не хватает?

+0

Это может быть полезным, а также (как к непосредственному вопросу и в целом понимание того, что часть руководства по языку R): http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/ – mweylandt

+1

mweylandt - достаточно смешно, это мой пост в блоге =) Кажется, мне нужно добавить раздел о родовых функции/методы, которые отличаются от обычного механизма поиска/поиска. Его немного расстраивает то, насколько сложный этот материал находится в R. – SFun28

+0

Это маленький мир, я полагаю ;-) Я оставлю его для всех, кто спотыкается об этом, если вы не возражаете. – mweylandt

ответ

3

Вы недостаточно читаете это достаточно внимательно. В нем говорится, что «база данных регистрации» хранится в среде (пространстве имен) общего типа, а не в самом методе. В случае base::as.matrix:

> grep("as.matrix",ls(base:::.__S3MethodsTable__.), value=TRUE) 
[1] "as.matrix.dist" "as.matrix.raster" "as.matrix.xts" "as.matrix.zoo" 
+0

прохладный! Означает ли это, что xxt привязан к загрузке? Поэтому, если xts указан в Импорт MyPackage, и я прикрепляю MyPackage (поэтому xts не находится в поиске()), то as.matrix все еще хранится в среде generic? – SFun28

+0

@ SFun28: это зависит от того, происходит ли регистрация при загрузке пространства имен или во время привязки к пути поиска. Я не знаю, в чем дело. –

1

В дополнение к проницательности Иешуа, который добавил к моему знанию .... Будучи в загруженном NAMESPACE не то же самое, как экспорт. Вы могли видеть функцию as.matrix.xts ни с одним из них:

getAnywhere(as.matrix.xts) 
xts:::as.matrix.xts 

Попробуйте ввести

search() 

Я также видел на любой SO или rhelp функцию, которая будет отображать R переводчица путь поиска для вызова функции, но на данный момент я не могу найти его. Это производит довольно длинный список имен функций:

apropos("as", mode="function") 

И этот список был еще наполовину долго:

apropos("^as\\.", mode="function") 
+0

Его хорошо знать о getAnywhere(), это ново для меня. Его довольно легко перечислить путь поиска as.matrix.xts (см. Stackoverflow.com/questions/8637107/parent-env-x-confusion), но я не видел функцию, которая сообщает вам, как R попадает в любой -экспортированная функция. Если вы можете выкопать это, это будет очень полезно. – SFun28

+0

Оператор с тремя точками - самый сильный метод поиска, который я знаю.Он не требует загрузки функции, только чтобы ее можно было найти в установленном пакете на пути к библиотеке. –

+0

правильно, но в качестве лучшей практики этого следует избегать. – SFun28

Смежные вопросы