2010-01-31 4 views
11

Как я могу определить определение функции S4? Например, я хотел бы увидеть определение TSconnect в пакете TSdbi. КомандаОсмотрите методы S4

showMethods("TSconnect") 

показывает, что есть, среди прочего, функция DRV = "histQuoteDriver", имя_бд = "характер".

Как я могу определить определение этой функции? Если бы это была функция S3, был бы только первый аргумент, определяемый (drv), который можно было бы проверить с помощью печати (TSconnect.histQuoteDriver).

Редактировать: От г-кузницы я узнал желаемый результат:

setMethod("TSconnect", signature(drv="histQuoteDriver", dbname="character"), 
    definition= function(drv, dbname, user="", password="", host="", ...){ 
    # user/password/host for future consideration 
    if (is.null(dbname)) stop("dbname must be specified") 
    if (dbname == "yahoo") { 
     con <- try(url("http://quote.yahoo.com"), silent = TRUE) 
     if(inherits(con, "try-error")) 
     stop("Could not establish TShistQuoteConnection to ", dbname) 
     close(con) 
     } 
    else if (dbname == "oanda") { 
     con <- try(url("http://www.oanda.com"), silent = TRUE) 
     if(inherits(con, "try-error")) 
     stop("Could not establish TShistQuoteConnection to ", dbname) 
     close(con) 
     } 
    else 
     warning(dbname, "not recognized. Connection assumed working, but not tested.") 

    new("TShistQuoteConnection", drv="histQuote", dbname=dbname, hasVintages=FALSE, hasPanels=FALSE, 
     user = user, password = password, host = host) 
    }) 

Есть ли способ, чтобы получить это определение изнутри R сессии?

+0

Возможно, вы найдете http://stevencarlislewalker.wordpress.com/s3-s4-dictionary/ полезным. –

ответ

10

S4 классы относительно сложны, поэтому я бы предложил reading this introduction.

В этом случае TSdbi является примером общего класса S4, который расширяется всеми конкретными пакетами баз данных (например, TSMySQL, TSPostgreSQL и т. Д.). Больше нет метода TSconnect() в TSdbi, чем то, что вы видите: drv = "character", dbname = "character" являются параметрами функции, а не функциями сами по себе. Если вы устанавливаете некоторые из конкретных пакетов баз данных и используете showMethods («TSconnect»), вы увидите все конкретные экземпляры этой функции. Если вы затем вызовете TSconnect() с определенным драйвером базы данных, он пойдет и будет использовать соответствующую функцию.

Вот как работают такие функции, как сводная работа. Например, попробуйте позвонить showMethods(summary). В зависимости от того, какие пакеты загружены, вы должны увидеть несколько возвращенных методов.

Вы можете легко увидеть исходный код для R-Forge: http://r-forge.r-project.org/plugins/scmsvn/viewcvs.php/pkg/TSdbi/R/TSdbi.R?rev=70&root=tsdbi&view=markup. Таков объем этой функции:

setGeneric("TSconnect", def= function(drv, dbname, ...) standardGeneric("TSconnect")) 

setMethod("TSconnect", signature(drv="character", dbname="character"), 
    definition=function(drv, dbname, ...) 
      TSconnect(dbDriver(drv), dbname=dbname, ...)) 
+1

Учебник S4 и ссылка на репозиторий r-forge очень полезны. Я отредактировал мой вопрос, чтобы сделать его более ясным. –

+0

+1 для ссылки. –