2017-01-26 2 views
1

FYI, похоже, у этого вопроса уже есть LISP equivalent.Включение обычной функции R S3 в общий

Недавно я хотел создать расширение dataframe для базовой функции R setdiff и думал, что общий будет приятным. Следующие работы, но неуклюжие:

#' @export setdiff.default 
setdiff.default <- setdiff 

#' @export 
setdiff <- function(x, ...) { 
    UseMethod("setdiff") 
} 
#' @export 
setdiff.data.frame <- function(A, B) { 
    A[!duplicated(rbind(B, A))[nrow(B) + 1:nrow(A)], ] 
} 

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

Есть ли чистый способ сделать это?

+0

Я не вижу проблемы. Я считаю это «хорошей вещью», когда в справочном индексе отображаются страницы справки скрытой функции. Вы смотрели ваши варианты под '? SetMethod'? –

+0

Да, возможно, я прошу слишком много. Я надеялся на способ «объединить» базовый метод с новым родовым. –

ответ

4

Это можно сделать, используя S4. Обратите внимание, что setdiff использует аргументы x и y, поэтому метод также должен:

setGeneric("setdiff") 

setdiff.data.frame <- function(x, y) { 
    x[!duplicated(rbind(y, x))[nrow(y) + 1:nrow(x)], ] 
} 
setMethod("setdiff", signature("data.frame", "data.frame"), setdiff.data.frame) 

# test 
setdiff(BOD[1:3, ], BOD[2:4, ]) 
Смежные вопросы