将eventReactive与渲染函数

时间:2017-04-18 18:21:01

标签: r shiny

我已经在这个问题上坚持了两天了,我希望得到一些比我更聪明的人的帮助。我正在使用名为" shinyTable"(https://github.com/trestletech/shinyTable)的软件包,我很难操纵它。基本上,我如何根据输入$ rows改变它的大小如果我点击"提交"按钮?这是一个工作代码,没有"提交"按钮:

library(shinythemes)
library(shiny)
library(shinyTable)

ui <- fluidPage(theme = shinytheme("slate"),titlePanel(HTML("<h1> <font face=\"Rockwell Extra Bold\" color=\"#b42000\"><b><b>R/Econ</b></b></font> <font face=\"Lucida Calligraphy\" colsor=\"white\" >Model</font></h1>")),
                sidebarLayout(
                  sidebarPanel( 
                    numericInput("rows", label = h3("Number of Rows"), value = 20),
                    numericInput("cols", label = h3("Number of Columns"), value = 2)
                  ),
                  mainPanel(
                    htable("tbl")
                  )
                )
)
server <- function(input, output) 
{
  output$tbl <- renderHtable({
    if (is.null(input$tbl)){
      # Seed the element with some data initially
      tbl <- data.frame(list(num1=1:input$rows, 
                             num2=(1:input$rows)*20,
                             letter=LETTERS[1:(input$rows)]))
      cachedTbl <<- tbl
      print(tbl)
      return(tbl)
    } else{
      cachedTbl <<- input$tbl
      print(input$tbl)
      return(input$tbl)
    }
  })

}
shinyApp(ui = ui, server = server)

现在,我想在输入$ rows或输入$ cols更改时动态更改表的大小。我不能为我的生活弄清楚如何使这项工作。我尝试了以下方法:

myx<-eventReactive (input$submit, { 
  output$tbl <- renderHtable({
    if (is.null(input$tbl)){
      tbl <- data.frame(list(num1=1:input$rows, 
                             num2=(1:input$rows)*20,
                             letter=LETTERS[1:(input$rows)]))
      cachedTbl <<- tbl
      print(tbl)
      return(tbl)
    } else{
      cachedTbl <<- input$tbl
      print(input$tbl)
      return(input$tbl)
    }
  }) 
  })

但这不起作用。我的思维过程是,如果单击提交按钮,它将重新创建表。我想输入$ rows来改变表的大小,但是我改变大小和点击提交按钮都没有做任何事情。实际上,添加eventReactive会将表更改为没有值的位置,并且不能输入任何值。老实说,我输了。我尝试了其他变体,例如:

myx<-eventReactive (input$submit, { 
    if (is.null(input$tbl)){
      tbl <- data.frame(list(num1=1:input$rows, 
                             num2=(1:input$rows)*20,
                             letter=LETTERS[1:(input$rows)]))
      cachedTbl <<- tbl
      print(tbl)
      return(tbl)
    } else{
      cachedTbl <<- input$tbl
      print(input$tbl)

    }
  })
    #-------
 # myx2<-eventReactive (cachedTbl, { 
 # })
    output$tbl <- renderHtable({
       tbl<<-myx()
        print(data.frame(tbl))#Tried and failed using myx()
        return(data.frame(tbl))

    })

在这样做时,我认为我可以使表反应,然后将其传递给renderHTable。所有这些尝试都分享了我试图让事情变得反应的事实。

如果我点击&#34;提交&#34;如何根据输入$ rows更改此表的大小?按钮?请帮忙!

1 个答案:

答案 0 :(得分:0)

这应该让你开始。根据我的评论,您应该使用rhandsontable。这个包使用相同的底层JS库handsontable.JS,但它得到了很好的支持,它在Cran上(免责声明:我是这个包的次要贡献者)。

以下工作示例基于rhandsontable。为简单起见,我只实现了行数的更改。

请注意我没有实现任何类型的缓存机制,无论是全局变量还是反应变量,因为它没有必要,但可以很容易地添加。

这是我所知道的shiny中工作的库的唯一示例,其中output$somethinginput$something相关联。

在这种情况下,代码中的input$tbl引用该表,但要转换为数据框,需要通过便捷函数hot_to_rhandsontable转换为{ {1}})。

我相信您已经熟悉这一点:您使用R检查用户是否更改了所显示表格中的任何内容(假设它不是只读的)。 hot_to_r(input$tbl)有一个更复杂的机制,但它很容易发生比赛。

shinyTable

如果这对您有用,请告诉我,否则我会尽力根据您的需要进行更改。