将eventReactive与渲染函数一起使用
我已经被这个问题困扰了两天了,我希望能得到比我聪明得多的人的帮助。我正在使用一个名为“shinyTable”()的包,我很难对它进行操作。基本上,如果我单击“提交”按钮,如何根据输入的$行更改此表的大小?下面是一个不带“提交”按钮的工作代码:将eventReactive与渲染函数一起使用,r,shiny,R,Shiny,我已经被这个问题困扰了两天了,我希望能得到比我聪明得多的人的帮助。我正在使用一个名为“shinyTable”()的包,我很难对它进行操作。基本上,如果我单击“提交”按钮,如何根据输入的$行更改此表的大小?下面是一个不带“提交”按钮的工作代码: 库(shinythemes) 图书馆(闪亮) 图书馆(shinyTable) ui这应该让你开始了。根据我的评论,您应该使用rhandsontable。此软件包使用相同的底层JS库,handsontable.JS,但它得到了很好的支持,并且在Cran上(免
库(shinythemes)
图书馆(闪亮)
图书馆(shinyTable)
ui这应该让你开始了。根据我的评论,您应该使用rhandsontable
。此软件包使用相同的底层JS库,handsontable.JS
,但它得到了很好的支持,并且在Cran上(免责声明:我是此软件包的次要贡献者)
下面的工作示例基于rhandsontable
。为了简单起见,我只实现了行数的更改
请注意,我没有实现任何类型的缓存机制,无论是全局变量还是反应变量,因为这不是必需的,但可以很容易地添加
这是我所知道的唯一一个库在shinny
中工作的例子,其中有一个输出$something
链接到输入$something
在这种情况下,代码中的输入$tbl
参考该表,但要转换为数据帧,需要通过便利功能hot\u to_r
(handsontable
tor
)进行转换
我相信您已经熟悉了这一点:您可以使用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)