Проблема, которую я пытаюсь решить, заключается в необходимости применения (выполнения) объекта S3, который по сути является вектороподобной структурой. Это может содержать различные формулы, которые на каком-то этапе мне нужно оценить для одного аргумента, чтобы получить вектороподобный объект исходной формы, содержащий оценку составляющих его формул по данному аргументу.
Примерами этого (просто чтобы проиллюстрировать) может быть матрица преобразования, скажем, вращения, которая будет принимать угол поворота на угол, и создавать матрицу значений, на которую нужно умножить точку для данного вращения. Другим примером может быть вектор состояний в задаче классической механики. Тогда, учитывая t , v , a и т. Д., Он может вернуть s ...
Теперь я создал свой контейнерный объект в S3, и он в большинстве случаев работает нормально, используя универсальные методы; Я также нашел очень полезной систему перегрузки операторов Ops.myClass.
Чтобы завершить мой урок, все, что мне сейчас нужно, это способ указать его как исполняемый.
Я вижу, что существуют различные механизмы, которые будут делать то, что я хочу частично, например, я предполагаю, что as.function()
преобразует объект в поведение, которое я хочу, и что-то вроде lapply()
может быть использовано для "обратного" применения аргумент к функциям. То, что я не уверен, как это сделать, это связать все это так, чтобы я мог сделать что-то вроде этого макета:
new_Object <- function(<all my function vector stuff spec>)
vtest <- new_Object(<say, sin, cos, tan>)
vtest(1)
==>
myvec(.8414709848078965 .5403023058681398 1.557407724654902)
(Да, я уже определил стандартную подпрограмму print()
, которая сделает его красивым)
Приветствуются все предложения, примеры кода, ссылки на примеры.
PS =====
Я добавил несколько базовых примеров кода согласно запросу.
Я не уверен, сколько будет слишком много, поэтому полный рабочий минимальный пример, включая перегрузку операторов, приведен в этом списке здесь .
Ниже показаны только функции конструктора и вспомогательные функции:
# constructor
new_Struct <- function(stype , vec){
stopifnot(is.character(stype)) # enforce up | down
stopifnot(is.vector(vec))
structure(vec,class="Struct", type=stype)
}
# constructor helper functions --- need to allow for nesting!
up <-function(...){
vec <- unlist(list(...),use.names = FALSE)
new_Struct("up",vec)
}
down <-function(...){
vec <- unlist(list(...),use.names = FALSE)
new_Struct("down",vec)
}
Приведенный выше код ведет себя так:
> u1 <- up(1,2,3)
> u2 <- up(3,4,5)
> d1 <- down(u1)
> d1
[1] down(1, 2, 3)
> u1+u2
[1] up(4, 6, 8)
> u1+d1
Error: '+' not defined for opposite tuple types
> u1*d1
[1] 14
> u1*u2
[,1] [,2] [,3]
[1,] 3 4 5
[2,] 6 8 10
[3,] 9 12 15
> u1^2
[1] 14
> s1 <- up(sin,cos,tan)
> s1
[1] up(.Primitive("sin"), .Primitive("cos"), .Primitive("tan"))
> s1(1)
Error in s1(1) : could not find function "s1"
Что мне нужно, так это чтобы это можно было сделать:
> s1(1)
[1] up(.8414709848078965 .5403023058681398 1.557407724654902)