【问题标题】:Implement zoom and reset functionality using action buttons in R shiny使用 R Shiny 中的操作按钮实现缩放和重置功能
【发布时间】:2018-02-24 15:27:27
【问题描述】:

给定的 R 脚本创建一个带有四个操作按钮的 tabPanel 和一个来自虹膜数据的反应散点图。我想在其他三个按钮上启用功能,以便第二个按钮放大绘图,第三个按钮缩小,第四个按钮重置在绘图上所做的选择。我尝试了“缩放”包和 zm() 但没有达到我的目的。请帮忙,谢谢。

## app.R ##
library(shiny)
library(shinydashboard)

ui <- dashboardPage(
dashboardHeader(title = "Zoom and Reset Dashboard",titleWidth = 290),
dashboardSidebar(
width = 0
),
dashboardBody(
# Creation of tabs and tabsetPanel
tabsetPanel(type = "tab",
tabPanel("Resource Dashboard", 

                  fluidRow(
                       column(1,
                            tags$head(
                                tags$style(HTML('#buttonresfreqone:hover {
                                                background-color: #008CBA;
                                                color: #ffffff;
                                                width: 150%;
                                                }'))
                                                   ),
                              tags$br(actionButton("buttonresfreqone", 
"Activity",style="color: #000000; width:100%;height:50px; ")),
                              tags$br(),
                              tags$head(
                                tags$style(HTML('#buttonresfreqtwo:hover {
                                                background-color: #008CBA;
                                                color: #ffffff;
                                                width: 150%;
                                                }'))
                                                   ),
                              tags$br(actionButton("buttonresfreqtwo", 
"Zoom-In",style="color: #000000; width:100%;height:50px; ")),
                              tags$br(),
                              tags$head(
                                tags$style(HTML('#buttonresfreqthree:hover {
                                                background-color: #008CBA;
                                                color: #ffffff;
                                                width: 150%;
                                                }'))
                                                   ),
                              tags$br(actionButton("buttonresfreqthree", 
"Zoom-Out",style="color: #000000; width:100%;height:50px; ")),
                              tags$br(),
                              tags$head(
                                tags$style(HTML('#buttonresfreqfour:hover {
                                                background-color: #008CBA;
                                                color: #ffffff;
                                                width: 150%;
                                                }'))
                                                   ),
                              tags$br(actionButton("buttonresfreqfour", 
HTML("Reset"),
                                                   style="color: #000000; 
width:100%;height:50px;"))),
                       tags$br(),
                       column(10,

                              box(title = "Resource Frequency", status = 
"primary",height = "460",width = "550", solidHeader = T,
                                  plotOutput("res_freq_plot"))))
                     ),
                     id= "tabselected"
            )

                                ))

server <- function(input, output) { 

#Code for Resource Dashboard Resource Frequency Plots

values_res_freq <- reactiveValues(res_freq_one = 0, res_freq_two = 0, 
res_freq_three = 0, 
                                res_freq_four = 0, res_freq_five = 0)
observeEvent(input$buttonresfreqone, {
values_res_freq$res_freq_one <- 1
values_res_freq$res_freq_two <- 0
values_res_freq$res_freq_three <- 0
values_res_freq$res_freq_four <- 0
values_res_freq$res_freq_five <- 0

})
observeEvent(input$buttonresfreqtwo, {
values_res_freq$res_freq_one <- 0
values_res_freq$res_freq_two <- 1
values_res_freq$res_freq_three <- 0
values_res_freq$res_freq_four <- 0
values_res_freq$res_freq_five <- 0

})
observeEvent(input$buttonresfreqthree, {
values_res_freq$res_freq_one <- 0
values_res_freq$res_freq_two <- 0
values_res_freq$res_freq_three <- 1
values_res_freq$res_freq_four <- 0
values_res_freq$res_freq_five <- 0

})
observeEvent(input$buttonresfreqfour, {
values_res_freq$res_freq_one <- 0
values_res_freq$res_freq_two <- 0
values_res_freq$res_freq_three <- 0
values_res_freq$res_freq_four <- 1
values_res_freq$res_freq_five <- 0
})
output$res_freq_plot <- renderPlot(
{

    if(values_res_freq$res_freq_one)
    plot(iris$Sepal.Length)
  else
    return()

}

)
}
shinyApp(ui, server)

【问题讨论】:

  • 也许你可以做类似this
  • 嗨,非常感谢您的回复,不错的帖子,但仅需要使用操作按钮。请帮忙
  • 放大是指放大绘图中的特定区域还是增加绘图的大小?
  • 点击放大按钮,绘图的大小应该增加,点击缩小按钮,大小应该减小,然后点击重置按钮,我想撤消所有选择。我还添加了快照供您参考。谢谢

标签: r shiny shinydashboard shinyapps


【解决方案1】:

您可以按照this 链接中的建议为 renderPlot 函数指定高度和宽度。

第一步是使用默认值创建高度和宽度的反应值,然后根据单击按钮的要求更改高度和宽度值。

我已经修改了你的服务器代码来做到这一点。希望对您有所帮助!

server <- function(input, output) { 

  #Code for Resource Dashboard Resource Frequency Plots

  values_res_freq <- reactiveValues(res_freq_one = 0, res_freq_two = 0, 
                                    res_freq_three = 0, 
                                    res_freq_four = 0, res_freq_five = 0)

  #Reactive values for height and width of the plot
  Val <- reactiveValues(height = 400, width = 600)


  observeEvent(input$buttonresfreqone, {#Activity
    values_res_freq$res_freq_one <- 1
    values_res_freq$res_freq_two <- 0
    values_res_freq$res_freq_three <- 0
    values_res_freq$res_freq_four <- 0
    values_res_freq$res_freq_five <- 0

  })
  observeEvent(input$buttonresfreqtwo, {#Zoom in
    values_res_freq$res_freq_one <- 0
    values_res_freq$res_freq_two <- 1
    values_res_freq$res_freq_three <- 0
    values_res_freq$res_freq_four <- 0
    values_res_freq$res_freq_five <- 0

    #Increase height and width 
    Val$height <- Val$height *1.25
    Val$width <- Val$width *1.25

  })
  observeEvent(input$buttonresfreqthree, {#Zoom out
    values_res_freq$res_freq_one <- 0
    values_res_freq$res_freq_two <- 0
    values_res_freq$res_freq_three <- 1
    values_res_freq$res_freq_four <- 0
    values_res_freq$res_freq_five <- 0

    #Decrease height and width 
    Val$height <- Val$height /1.25
    Val$width <- Val$width /1.25

  })
  observeEvent(input$buttonresfreqfour, {#Reset
    values_res_freq$res_freq_one <- 0
    values_res_freq$res_freq_two <- 0
    values_res_freq$res_freq_three <- 0
    values_res_freq$res_freq_four <- 1
    values_res_freq$res_freq_five <- 0

    #Set default value for height and width
    Val$height <- 400
    Val$width <- 600
  })

  observe({
    output$res_freq_plot <- renderPlot(
      {

        if(values_res_freq$res_freq_one)
          plot(iris$Sepal.Length)
        else
          return()

      }, height = Val$height, width = Val$width 

    )
  })


}

【讨论】:

  • 太棒了,它工作得非常好,只是一个小问题,当我点击放大按钮时,它只会放大一个空白屏幕,然后我必须再次点击活动按钮才能进行增强情节出现。缩小的类似情况。我应该点击缩放功能,整个情节应该得到增强。谢谢你,请帮忙。
  • 那是因为你把if(values_res_freq$res_freq_one)放在renderPlot函数中的条件。如果将 values_res_freq$res_freq_one 设置为 1 而不是零,它应该可以工作。
  • 哦,非常感谢,亲爱的,非常棒的帮助,非常棒的帮助。
  • 嗨 SBista,关于这个讨论,我们有一段时间了,我需要更多帮助,你的脚本帮助了我很多,但我只想在生成的情节上实现一个跨度功能,比如点击情节并将其向任何方向移动。如果你能帮我解决这个问题。谢谢。
  • 对于平移,您应该考虑使用像 ggiraph 这样的包。
猜你喜欢
  • 2015-07-30
  • 2011-10-10
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 2018-08-15
  • 2014-08-15
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多