Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 访问S4函数超类的插槽_R_S4 - Fatal编程技术网

R 访问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 我得

我可以创建一个“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 
我得到立方体,如果我得到:

> 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