我正在尝试设置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
谢谢!
答案 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对象的大量知识。 。 。