我正在尝试与Rshiny做一个热图。用户必须能够选择2个变量:时间和方向。取决于热图的变化。
当我确定时间和方向的值时,我的代码正在工作。当我尝试使用无功输入时,它不起作用。
错误消息是: .getReactiveEnvironment()$ currentContext()中的错误: 没有活动的响应上下文,不允许进行操作。 (您尝试做只能从反应式表达式或观察器内部完成的操作。)
JSd_inter是一个功能,如有需要,我可以向您显示。在第一个示例中,我使用“ T1” 固定了时间,并使用“ both” 进行了定向,这2个示例是我用来为热图创建数据框的2种不同方式。示例1工作,但我不能更改值,示例2不工作。在第3部分中,您可以找到我用来绘制热图的代码
idt <- as.vector(unique(data$contratid))
n= length(idt)
a <- matrix(0, n,n)
colnames(a) <- idt
rownames(a) <- idt
for (i in 1:n) {
for (j in 1:n) {
a[i,j] <- JSD_inter(data,20,"T1","both",idt[i],idt[j])
}}
第二个示例不起作用(即使我在函数中使用input $ timechoice而不是time(),它也仍然有效)
time <- reactive({input$timechoice})
direction<- reactive({input$dirchoice})
idt <- as.vector(unique(data$contratid))
n= length(idt)
a <- matrix(0, n,n)
colnames(a) <- idt
rownames(a) <- idt
for (i in 1:n) {
for (j in 1:n) {
a[i,j] <- JSD_inter(data,20,time(),direction(),idt[i],idt[j])
}}
第3部分/绘制热图的代码(因为示例1在起作用,我不认为问题来自这里)
reorder_cormat <- function(cormat){
# Utiliser la corrélation entre les variables
# comme mésure de distance
dd <- as.dist((1-cormat)/2)
hc <- hclust(dd)
cormat <-cormat[hc$order, hc$order]
}
# Obtenir le triangle supérieur
get_upper_tri <- function(cormat){
cormat[lower.tri(cormat)]<- NA
return(cormat)
}
# Reorder correlation matrix
cormat <- reorder_cormat(a)
upper_tri <- get_upper_tri(cormat)
# Fondre la matrice de corrélation
melted_cormat <- melt(upper_tri, na.rm = TRUE)
# Créer un ggheatmap
ggheatmap <- ggplot(melted_cormat, aes(Var2, Var1, fill = value))+
geom_tile(color = "white")+
scale_fill_gradient2(low = "white", high = "red",
midpoint = 0.09, limit = c(0,1), space = "Lab",
name="JSD") +
theme_minimal()+ # minimal theme
theme(axis.text.x = element_text(angle = 45, vjust = 1,
size = 12, hjust = 1))+
coord_fixed()
output$heat <- renderPlot(ggheatmap)
使用ui.R将我的shyniapp中的热图添加到代码中:
tabPanel(“ Heatmap”,plotOutput(“ heat”)),
如果需要更多信息,请告诉我
感谢您的时间
答案 0 :(得分:1)
direction()
和time()
是反应性的。您不能在反应式上下文之外使用它们。
尝试一下:
myMatrix <- reactive({
idt <- as.vector(unique(data$contratid))
n= length(idt)
a <- matrix(0, n,n)
colnames(a) <- idt
rownames(a) <- idt
for (i in 1:n) {
for (j in 1:n) {
a[i,j] <- JSD_inter(data,20,time(),direction(),idt[i],idt[j])
}
}
a
})
然后
melted_cormat <- reactive({
cormat <- reorder_cormat(myMatrix())
upper_tri <- get_upper_tri(cormat)
melt(upper_tri, na.rm = TRUE)
})
最后,您必须在ggplot
内执行renderPlot
,因为它会调用melted_cormat()
:
output$heat <- renderPlot({
ggplot(melted_cormat(), aes(Var2, Var1, fill = value))+
geom_tile(color = "white")+
scale_fill_gradient2(low = "white", high = "red",
midpoint = 0.09, limit = c(0,1), space = "Lab",
name="JSD") +
theme_minimal()+ # minimal theme
theme(axis.text.x = element_text(angle = 45, vjust = 1,
size = 12, hjust = 1))+
coord_fixed()
})