2015-01-27 2 views
0

мне было интересно, если это возможно, использовать Эталонные классы подкласса функцию в R. Например, следующийКак подкласс функции в R?

> CustomFunction <- setRefClass("CustomFunction", contains = "function") 
> foo <- CustomFunction() 
> foo() 
NULL 

работает нормально (не выдаст ошибку), но как я могу настроить поведение (т.е. за исключением возврата NULL)? Как определить аргументы функции?

Я также попытался

> setMethod("(", 
> signature(x = "CustomFunction"), 
> function(...) { 
>  "Hello!" # A function that always returns "Hello!" 
> } 
>) 
Error in genericForPrimitive(f) : 
    methods may not be defined for primitive function ‘(’ in this version of R 

, но это не похоже на работу.


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

ответ

1

Для этого вам не нужны ссылочные классы, вы можете просто заключите функцию интереса

logger <- function(f) { 
    force(f) 
    function(...) { 
     print("running function...") 
     f(...) 
    } 
} 

printhello <- function(name="Al") print(paste("hello", name)) 

printhello_logged <- logger(printhello) 

printhello() 
# [1] "hello Al" 
printhello_logged("Zed") 
# [1] "running function..." 
# [1] "hello Zed" 

Если это для целей типа аудита/тестирования, вы можете быть заинтересованы в trace(), который позволяет присоединить код к различным частям функций.

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