R - Shiny App - 使用 plotly 可视化 shinyMatrix 输入

R - Shiny App - Using plotly to visualize shinyMatrix input

)

我想使用 plotlymesh3d-plot 可视化 shinyMatrix 的输入。我正在使用 for-loop 将矩阵输入转换为具有 3 列(x、y 和 z)的数据框 - 见下文。当 运行 在闪亮的应用程序之外时,这会起作用。不幸的是,我一直坚持在 reactive() 环境中使用这个 for 循环将其传递给 plot_ly()。它说“闭包类型的对象不是可子集化的”。我读到,如果您不将反应对象视为函数(我这样做了),这个错误经常会出现。

我知道我是初学者,我对 shiny 应用程序的语法不太了解。很可能我犯了一个愚蠢的错误 :-) 但我不知道如何解决这个问题。

谢谢!

library(shiny)
library(shinyMatrix)

ui <- fluidPage(   titlePanel("shinyMatrix: Simple App"),   
                   sidebarPanel(width = 6,tags$h4("Data"),     
                                     matrixInput("mat", 
                                                 value = matrix(1:100, 10, 10), 
                                                 rows = list(names=T, extend = TRUE), 
                                                 cols = list(names = TRUE))),
                   mainPanel(width = 6,
                             plotlyOutput(
                                 "plotly",
                                 width = "100%",
                                 height = "400px",
                                 inline = FALSE,
                                reportTheme = TRUE
                             ))) 
   
 
server <- function(input, output, session) {  

df <- data.frame(x="", y="", z="")   

df <- reactive({    
    n=1
    for(i in 1:nrow(input$mat)){
        for(j in 1:ncol(input$mat)){
            df[n,1] <- j*laenge
            df[n,2] <- i*laenge
            df[n,3] <- input$mat[i,j]
            n=n+1
        }
    } 
    })

output$plotly <- renderPlotly({plot_ly(df(), x=~x, y=~y, z=~z, type="mesh3d")})   
}


shinyApp(ui, server)

主要问题是您对反应式数据框和数据框使用了相同的名称 df。此外,您的反应必须 return 一些东西才能使您的代码正常工作,即 return for 循环之后的数据框。

server <- function(input, output, session) {
  dd <- data.frame(x = NA, y = NA, z = NA)

  df <- reactive({
    n <- 1
    for (i in 1:nrow(input$mat)) {
      for (j in 1:ncol(input$mat)) {
        dd[n, 1] <- j * laenge
        dd[n, 2] <- i * laenge
        dd[n, 3] <- input$mat[i, j]
        n <- n + 1
      }
    }
    dd
  })

  output$plotly <- renderPlotly({
    plot_ly(df(), x = ~x, y = ~y, z = ~z, type = "mesh3d")
  })
}