我正在阅读Protocol
包中的Transport
和asyncio
类的文档。具体做法是:
在子类化协议类时,建议您覆盖某些方法。这些方法是回调:它们将由传输在某些事件上调用(例如,当收到某些数据时);你不应该自己打电话,除非你正在实施交通工具。
强调添加
因此,原则上应该可以实现传输,但是......
传输是asyncio提供的类,用于抽象各种通信信道。您通常不会自己实例化运输;相反,您将调用一个AbstractEventLoop方法 (哪一个?),它将创建传输并尝试启动底层通信通道,并在成功时回拨。
再次强调了
阅读关于AbstractEventLoop的部分我并没有看到任何创建自定义传输的方法。它最接近的是AbstractEventLoop.create_connection(protocol_factory, host=...)
,这只暗示它会创建某种插座......
好吧,我的最终目标是使用自定义传输,它不是任何类型的套接字(可能是StringIO
,也许是数据库连接游标,也许是另一种协议。)
那么,这只是一个很好的但是从未在文档中实现过的错误,或者实际上有一种方法可以实现自定义传输而不需要修补asyncio
并牺牲第一个生命值?
答案 0 :(得分:6)
需要一些样板代码,尽管它不是太多:
GOHeat_fix <- function (data, nlfc, fill.col)
{
x <- y <- z <- NULL
if (missing(nlfc))
nlfc <- 0
else nlfc <- nlfc
if (missing(fill.col))
fill.col <- c("firebrick", "white", "dodgerblue")
else fill.col <- fill.col
distance <- dist(data)
cluster <- hclust(distance)
M <- dim(data)[2]
nterm <- M - nlfc
if (nlfc == 0) {
s <- rowSums(data[, 1:nterm])
tmp <- NULL
for (r in 1:nrow(data)) {
tmp <- c(tmp, as.numeric(gsub(1, s[r], data[r, 1:nterm])))
}
}
else {
tmp <- NULL
for (r in 1:nrow(data)) {
tmp <- c(tmp, as.numeric(gsub(1, data[r, (nterm +
1)], data[r, 1:nterm])))
}
}
df <- data.frame(x = factor(rep(cluster$order, each = nterm)), y = rep(colnames(data[,
1:nterm]), length(rownames(data))), z = tmp, lab = rep(rownames(data),
each = nterm))
df_o <- df[order(df$x), ]
g <- ggplot() +
geom_tile(data = df_o, aes(x = x, y = y, fill = z)) +
scale_x_discrete(breaks = 1:length(unique(df_o$x)), labels = unique(df_o$lab)) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.y = element_text(size = 14),
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
coord_fixed()
if (nlfc == 0) {
g + scale_fill_gradient2("Count", space = "Lab", low = fill.col[2],
mid = fill.col[3], high = fill.col[1])
}
else {
g + scale_fill_gradient2("logFC", space = "Lab", low = fill.col[3],
mid = fill.col[2], high = fill.col[1])
}
}