R 访问S4函数超类的插槽
我可以创建一个“function”的S4超类并从函数调用访问该对象的插槽吗?目前我有:R 访问S4函数超类的插槽,r,s4,R,S4,我可以创建一个“function”的S4超类并从函数调用访问该对象的插槽吗?目前我有: > setClass("pow",representation=representation(pow="numeric"),contains="function") [1] "pow" > z=new("pow",function(x){x^2},pow=3) > z(2) [1] 4 现在我真正想要的是函数x等于@pow插槽自身的幂,所以如果我这样做: > z@pow=3 我得
> setClass("pow",representation=representation(pow="numeric"),contains="function")
[1] "pow"
> z=new("pow",function(x){x^2},pow=3)
> z(2)
[1] 4
现在我真正想要的是函数x等于@pow插槽自身的幂,所以如果我这样做:
> z@pow=3
我得到立方体,如果我得到:
> z@pow=2
我有正方形
但我不知道如何像在Python中那样获得对“self”的引用。我猜它在环境的某个地方
以下是它在python中的工作原理:
class Pow:
def __init__(self,power):
self.power=power
self.__call__ = lambda x: pow(x,self.power)
p = Pow(2) # p is now a 'squarer'
print p(2) # prints 4
p.power=3 # p is now a 'cuber'
print p(2) # prints 8
真的很简单,我甚至不需要做“导入反重力”…我想这取决于你真正想要什么。这个实现离您的目标更近了吗
setClass("pow",representation=representation(pow="numeric"),contains="function")
z=new("pow",function(x, pow=3){x^pow})
> z(2)
[1] 8
z(2,4)
#[1] 16
求助于一点语言操纵
setClass("Pow", representation("function", pow="numeric"),
prototype=prototype(
function(x) {
self <- eval(match.call()[[1]])
x^self@pow
}, pow=2))
虽然正如Spacedman所说,事情可能会出错
> f <- function() { Sys.sleep(2); new("Pow") }
> system.time(f()(2))
user system elapsed
0.002 0.000 4.005
与
似乎可以通过
sys.function
访问父函数
setClass("pow", slots = c(pow = "numeric"), contains = "function")
z <- new("pow", function (x) x^(sys.function()@pow), pow = 2)
z(6)
# [1] 36
z@pow <- 3
z(6)
# [1] 216
setClass(“pow”,slots=c(pow=“numeric”),contains=“function”)
我可以给你这个。虽然如果您尝试创建一个匿名对象:new(“Pow”)(3),它实际上从eval创建的另一个新对象而不是最初的“new”调用创建的对象获取\@Pow槽。这并不是说这有什么区别,不管怎样,这是一件非常反常的事情。埃瓦尔几乎总是邪恶的。你让我的眼睛流血了。我想你可能想用一个参考类是吗?这次S语言最终实现了面向对象编程吗?如果说是对的,你的意思是以你熟悉的方式实现了java等语言,那么是的。我的意思是S3显然是错误的(但这是一个非常莫比的黑客行为),而S4则是不明确的错误(见上文)。但是,是的,我认为极限是t->Inf然后是R->python。。。让我们去掉R中的花括号并使用缩进…对于引用类,您会得到“self”,但会失去Spacedman要求的“isA”关系(至少在我的实验中——一个更完整的例子?)。此外,pow指数上还有引用语义,尽管与python实现一致,但这可能会非常混乱。
setClass("ParameterizedFunFactory",
representation(fun="function", param="numeric"),
prototype=prototype(
fun=function(x, param) function(x) x^param,
param=2))
setGeneric("fun", function(x) standardGeneric("fun"))
setMethod(fun, "ParameterizedFunFactory",
function(x) x@fun(x, x@param))
> f = g = new("ParameterizedFunFactory")
> g@param = 3
> fun(f)(2)
[1] 4
> fun(g)(2)
[1] 8
setClass("pow", slots = c(pow = "numeric"), contains = "function")
z <- new("pow", function (x) x^(sys.function()@pow), pow = 2)
z(6)
# [1] 36
z@pow <- 3
z(6)
# [1] 216