Rshiny, реактивная тепловая карта, не может изменить переменную - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь сделать тепловую карту с Rshiny.Пользователь должен иметь возможность выбрать 2 переменные: время и направление.В зависимости от этого тепловая карта будет меняться.

Когда я фиксирую значение для времени и направления, мой код работает.Когда я пытаюсь использовать реактивный ввод, он не работает.

сообщение об ошибке: Ошибка в .getReactiveEnvironment () $ currentContext (): Операция не разрешена без активного реактивного контекста.(Вы пытались сделать что-то, что можно сделать только из реактивного выражения или наблюдателя.)


JSd_inter - это функция, которую я могу показать вам при необходимости.В первом примере я зафиксировал время с помощью "T1" и направление с помощью "оба" Эти два примера представляют собой 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])


}}

2-й пример, который не работает (даже если я использую в своей функции 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)


im priting тепловой картыв моем shyniapp используя ui.R с кодом:

tabPanel ("Heatmap", plotOutput ("heat")),

Пожалуйста, дайте мне знать, если вам нужнобольше информации

Спасибо за ваше время

1 Ответ

0 голосов
/ 30 января 2019

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()
})
...