我已经在这个问题上坚持了两天了,我希望得到一些比我更聪明的人的帮助。我正在使用名为" 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更改此表的大小?按钮?请帮忙!
答案 0 :(得分:0)
这应该让你开始。根据我的评论,您应该使用rhandsontable
。这个包使用相同的底层JS库handsontable.JS
,但它得到了很好的支持,它在Cran上(免责声明:我是这个包的次要贡献者)。
以下工作示例基于rhandsontable
。为简单起见,我只实现了行数的更改。
请注意我没有实现任何类型的缓存机制,无论是全局变量还是反应变量,因为它没有必要,但可以很容易地添加。
这是我所知道的shiny
中工作的库的唯一示例,其中output$something
与input$something
相关联。
在这种情况下,代码中的input$tbl
引用该表,但要转换为数据框,需要通过便捷函数hot_to_r
(handsontable
转换为{ {1}})。
我相信您已经熟悉这一点:您使用R
检查用户是否更改了所显示表格中的任何内容(假设它不是只读的)。 hot_to_r(input$tbl)
有一个更复杂的机制,但它很容易发生比赛。
shinyTable
如果这对您有用,请告诉我,否则我会尽力根据您的需要进行更改。