糟糕! S4 OOP代码错误和一个隐秘错误

时间:2018-08-28 17:14:00

标签: r oop s4

我正在尝试设置S4对象,但无法弄清楚它出了什么问题。该对象旨在帮助简化打印出一些人口统计信息。这是代码:

from flask import Flask
from pipenv.vendor.dotenv import load_dotenv
import os
import pprint

load_dotenv('.env_original')
pprint.pprint(dict(os.environ))

app = Flask(__name__)

@app.route('/')
def index():
    return 'hi'

if __name__ == '__main__':
    app.run(debug=True)

这里是引用的函数dem <- setClass("dem", slots = list(num_cats = "numeric", cat_labels = "character", cat_counts = "integer", cat_percents = "character") ) setMethod("print", "dem", function(.Object, x = numeric(0)) { .Object <- dem paste(dem@num_cats) }) make_dem = function(dd) { dem( num_cats = length(dd$values), cat_labels = dd$values$value, cat_counts = dd$values$frequency, cat_percents = calc_dem_percents(cat_counts) ) } ,很抱歉没有将其放在第一个循环中。

calc_dem_percents

calc_dem_percents <- function(cat_counts) { #calc percents for each category tot <- sum(cat_counts) #get total number of categories cat_counts <- cat_counts %>% as_tibble() #change to tibble because I do # that percent(cat_counts$value/tot) # return percents as a list, one per cat } 来自cat_counts

一切顺利,没有任何错误。然后,当我使用

dd$values$frequency

我明白了

gender <- make_dem(dd)

我在做什么错?我看到那里有很多相互矛盾的文档,并且完全感到困惑。

仅供参考,这是## Error in initialize(value, ...) : ## no slot of name "refMethods" for this object of ## "classRepresentation" 的结构:

dd

谢谢!

2 个答案:

答案 0 :(得分:1)

这个问题几乎可以肯定在这一行:

  cat_percents = calc_dem_percents(cat_counts)

可能有两件事是错误的:

  • 您引用了一个功能calc_dem_percents,该功能不存在(您是自己编写该功能而忘记将其包含在问题中,还是来自特定的R库?)。该功能可能存在错误。
  • 您引用了变量cat_counts,但此变量尚不存在(如果命名了dem的自变量,但没有,则可以。)最好改用dd$values$frequency

也许您在此问题的范围之外定义了自己的变量cat_counts(或将其声明为类),并且正在使用该变量,但是在这种情况下,我无济于事。

如果以上方法均无效,请尝试分别评估分配给插槽的每个表达式,看看是否能达到预期的效果(特别是,请务必检查每个表达式的class东西。)

答案 1 :(得分:0)

@JDL,我执行了您的建议,使用d$values$frequency代替cat_counts,但仍然存在相同的错误。然后,我又回过头来浏览make_dem_class,也正如您所建议的那样,看着值一个接一个地更新。还有一个问题:cat_counts的初始声明是dem类的一部分。我称它为整数,但它是两个整数,每个“猫”或类别的一个“计数”,其数量为cat_num-在这种情况下为2。当我检查对象的类时从cat_counts那里我发现:

class(dd$values$frequency)
# "array"

因此cat_counts应该被声明为数组,而不是整数。这是正确的代码:

dem <- setClass("dem", 
                slots = list(num_cats = "numeric",
                             cat_labels = "character",
                             cat_counts = "array",
                             cat_percents = "character")
       )

    setMethod("print", 
              "dem",
              function(.Object,
                       x = numeric(0)) {
                  .Object <- dem
                  print(dem@cat_labels)
                  print(dem@cat_counts)
                  print(dem@cat_percents)
              })

    make_dem = function(dd) {
        dem(
            num_cats = length(dd$values),
            cat_labels = dd$values$value,
            cat_counts = dd$values$frequency,
            cat_percents = calc_dem_percents(dd$values$frequency)
        )
    }

它有效。我非常感谢。

但是下一步没有。使用make_dem_class()创建了dem_obj,这是一个dem类的人口统计对象。我是这样的:

> dem_object <- make_dem_class(dd)
> dem_object

An object of class "dem"
Slot "num_cats":
[1] 2

Slot "cat_labels":
[1] "Male"   "Female"

Slot "cat_counts":
[1] 308 139

Slot "cat_percents":
[1] "68.9%" "31.1%"

这是它的结构:

> str(dem_object)
Formal class 'dem' [package ".GlobalEnv"] with 4 slots
  ..@ num_cats    : int 2
  ..@ cat_labels  : chr [1:2] "Male" "Female"
  ..@ cat_counts  : num [1:2(1d)] 308 139
  ..@ cat_percents: chr [1:2] "68.9%" "31.1%"

但是我的setMethod打印似乎有问题,因为当我尝试打印时,会发生这种情况:

Error in print(dem@cat_labels) : 
  no slot of name "cat_labels" for this object of class "classGeneratorFunction" 

关于使用S4对象的大量知识。 。 。