在Shiny/Plotly中使用Reactive触发对数刻度失效问题求助
问题解决:Shiny中Plotly图表对数刻度不响应单选按钮的问题
问题原因
你的代码中logsc()返回的是一个列表,当用logsc()[1]和logsc()[2]提取元素时,得到的是带命名的列表子集,而不是plotly布局需要的纯字符串值。Plotly无法识别这种带结构的输入,因此刻度类型不会随单选按钮更新。
修复方案
将提取列表元素的方式从[ ]改为[[ ]],直接获取字符串值即可解决问题:
修改后的完整代码
library(tidyverse) library(plotly) c1 <- c(1,2,3,4,5) c2 <- c(6,3,4,6,5) c3 <- c(1,2,3,4,5) df<- data.frame(c1,c2,c3) cols <- names(df) ui <- fluidPage( titlePanel("Log Test"), sidebarLayout( sidebarPanel( selectInput("x", "x-axis", cols), selectInput("y", "y-axis", cols), radioButtons("rb", "Log Axis", choiceNames = list("X", "Y", "Both", "None"), choiceValues = list("X", "Y", "Both", "None")) ), mainPanel( plotlyOutput("plot"), textOutput("note") ) ) ) server <- function(input, output, session) { x <- reactive({ df[,input$x] }) y <- reactive({ df[,input$y] }) logsc <- reactive({ if (input$rb=='X'){ list('log','linear') }else if (input$rb=='Y'){ list('linear','log') }else if (input$rb=='Both'){ list('log','log') }else{ list('linear','linear') } }) output$plot <- renderPlotly( { plot1 <- plot_ly( x = x(), y = y(), type = 'scatter', mode = 'markers' ) # 用[[ ]]提取纯字符串值 plot1 <- layout(plot1, xaxis = list(type = logsc()[[1]], ticks ='inside'), yaxis = list(type = logsc()[[2]], ticks = 'inside')) plot1 } ) output$note <- renderText({ paste0("rb ", logsc()[[1]],"-", logsc()[[2]]) }) } shinyApp(ui = ui, server = server)
关键修改说明
[ ]用于提取列表的子集(结果仍是列表),[[ ]]用于提取列表中的单个元素值(此处为字符串)- 替换后,plotly能正确识别刻度类型参数,图表布局会随单选按钮的选择实时更新
内容的提问来源于stack exchange,提问作者R Walser
相关产品推荐
相关产品推荐

