将eventReactive与渲染函数一起使用

将eventReactive与渲染函数一起使用,r,shiny,R,Shiny,我已经被这个问题困扰了两天了,我希望能得到比我聪明得多的人的帮助。我正在使用一个名为“shinyTable”()的包,我很难对它进行操作。基本上,如果我单击“提交”按钮,如何根据输入的$行更改此表的大小?下面是一个不带“提交”按钮的工作代码: 库(shinythemes) 图书馆(闪亮) 图书馆(shinyTable) ui这应该让你开始了。根据我的评论,您应该使用rhandsontable。此软件包使用相同的底层JS库,handsontable.JS,但它得到了很好的支持,并且在Cran上(免

我已经被这个问题困扰了两天了,我希望能得到比我聪明得多的人的帮助。我正在使用一个名为“shinyTable”()的包,我很难对它进行操作。基本上,如果我单击“提交”按钮,如何根据输入的$行更改此表的大小?下面是一个不带“提交”按钮的工作代码:

库(shinythemes)
图书馆(闪亮)
图书馆(shinyTable)

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

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

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

这是我所知道的唯一一个库在
shinny
中工作的例子,其中有一个
输出$something
链接到
输入$something

在这种情况下,代码中的
输入$tbl
参考该表,但要转换为数据帧,需要通过便利功能
hot\u to_r
handsontable
to
r
)进行转换

我相信您已经熟悉了这一点:您可以使用
hot\u to\r(input$tbl)
检查用户是否更改了显示表中的任何内容(假设它不是只读的)
shinyTable
的机制要复杂得多,但它很容易发生竞争

library(shinythemes)
library(shiny)
library(rhandsontable)

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(
                    rHandsontableOutput("tbl")
                  )
                )
)

server <- function(input, output, session) {

  data = reactive({
    if (is.null(input$tbl))  {
        DF <- data.frame(num1 = 1:input$rows, bool = TRUE, nm = LETTERS[1:input$rows],
                        dt = seq(from = Sys.Date(), by = "days", length.out = input$rows),
                        stringsAsFactors = F)

    } else  if(nrow(hot_to_r(input$tbl)) == input$rows) {
        DF <- hot_to_r(input$tbl)
      } else {
        DF <- data.frame(num1 = 1:input$rows, bool = TRUE, nm = LETTERS[1:input$rows],
                dt = seq(from = Sys.Date(), by = "days", length.out = input$rows),
                stringsAsFactors = F)
    }
    DF
  })

  output$tbl <- renderRHandsontable({
if (is.null(input$rows) | is.null(input$cols)) return()
    df = data()
    if (!is.null(df))
      rhandsontable(df, stretchH = "all")
  })

}

shinyApp(ui = ui, server = server)
库(shinythemes)
图书馆(闪亮)
图书馆(rhandsontable)

ui您应该使用rhandsontable,它是shinyTable的一种演变。rhandsontable位于Cran上,并进行维护。shinyTable不是。请尝试使用
observeEvent()
而不是
eventReactive()
,我无法找到您定义的
input$rows
,因为代码是空的
input$rows
是空的。嘿,恩佐,我知道您非常忙,所以我非常感谢您查看此评论。如何将保存到DF的新数据帧与以前的DF进行比较?换句话说,我想在用户输入任何新内容之前,将具有新用户输入的表格与表格进行比较?策略是将旧(未更改)值(如
dfOld
)与新值(如
dfNew
)进行比较。有不同的策略,一种是使用
(dfOld!=dfNew,arr.ind=TRUE)
,这会给您提供已更改的行和列。我会试着看看我是否可以把这个添加到代码中,但这将在一天左右:对不起。
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)
    }
  }) 
  })
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))

    })
library(shinythemes)
library(shiny)
library(rhandsontable)

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(
                    rHandsontableOutput("tbl")
                  )
                )
)

server <- function(input, output, session) {

  data = reactive({
    if (is.null(input$tbl))  {
        DF <- data.frame(num1 = 1:input$rows, bool = TRUE, nm = LETTERS[1:input$rows],
                        dt = seq(from = Sys.Date(), by = "days", length.out = input$rows),
                        stringsAsFactors = F)

    } else  if(nrow(hot_to_r(input$tbl)) == input$rows) {
        DF <- hot_to_r(input$tbl)
      } else {
        DF <- data.frame(num1 = 1:input$rows, bool = TRUE, nm = LETTERS[1:input$rows],
                dt = seq(from = Sys.Date(), by = "days", length.out = input$rows),
                stringsAsFactors = F)
    }
    DF
  })

  output$tbl <- renderRHandsontable({
if (is.null(input$rows) | is.null(input$cols)) return()
    df = data()
    if (!is.null(df))
      rhandsontable(df, stretchH = "all")
  })

}

shinyApp(ui = ui, server = server)