我希望我清楚。我想知道如何在服务器功能中将用户输入的数据帧从renderUI传递到evenReactive。问题是在eventReactive中找不到ct。请指教!
我的代码如下:
public static char hashTable[10][5] = {"", "", "abc", "def", "ghi", "jkl",
"mno", "pqrs", "tuv", "wxyz"};
答案 0 :(得分:1)
有关此详细/增强示例应用程序的一些事情。
uiOutput
和renderUI
,因为您要尝试的是更改selectInput
中的可用选项。req
正常运行,容易被禁用或删除(我经常在自己的闪亮应用中使用此代码,默认情况下处于禁用状态,以备不时之需)可能涉及反应性)。 (如果看到In:
而没有相应的Out:
,则意味着req
线路由于需求不足而中断了流量。)file2
,但从未设置过...我忽略了它,但我认为您可以扩展ui
来容纳它,并使用server
逻辑来处理它。sqldf
通常是足够安全的,但是它建议的SQL不能(直接)防止SQL注入。如果使用用户定义的自由文本进行这些查询,则应采取更多保护措施。defcat
,这是“选择类别”类型的消息。因为显然不是您要过滤的东西,所以我明确确保它不是过滤(并因此呈现)之前的选定类别。鉴于此,我将给出两个结果:一个不带renderUI
,另一个带它。
第一个,没有:
library(shiny)
library(sqldf)
defcat <- "Select a category ..."
ui <- fluidPage(
sidebarPanel(
fileInput("file1", "Import", accept = ".xlsx"),
selectInput("selectCAT", "Category", choices = defcat),
actionButton("goBu", "Click!")
),
mainPanel(
"Display Results",
tableOutput("acBTTON")
)
)
verbose <- TRUE
msg <- if (verbose) message else c
server <- function(input, output, session) {
dat_mt <- eventReactive(input$file1, {
msg("In: dat_mt ...")
req(input$file1)
out <- readxl::read_excel(input$file1$datapath, "mt")
msg("Out: dat_mt ...")
out
})
dat_ir <- eventReactive(input$file1, {
msg("In: dat_ir ...")
req(input$file1)
out <- readxl::read_excel(input$file1$datapath, "ir")
msg("Out: dat_ir ...")
out
})
observeEvent(dat_mt(), {
msg("In: observe dat_mt() ...")
req(dat_mt())
sel <- if (input$selectCAT %in% dat_mt()$cyl) input$selectCAT else defcat
updateSelectInput(session, "selectCAT",
choices = c(defcat, sort(unique(dat_mt()$cyl))),
selected = sel)
msg("Out: observe dat_mt() ...")
})
pf <- eventReactive(input$goBu, {
msg("In: event input$goBu ...")
req(defcat != input$selectCAT, dat_mt(), dat_ir())
mt <- dat_mt()
ir <- dat_ir()
# WARNING: potential for SQL injection, proof-of-concept only
out <- sqldf(paste("select * from mt where cyl =", input$selectCAT))
msg("Out: event input$goBu ...")
out
})
output$acBTTON <- renderTable({
msg("In: acBTTN ...")
req(pf())
out <- pf()
msg("Out: acBTTN ...")
out
})
}
shinyApp(ui, server)
第二个,带有动态UI。注意只有两个区别:
ui <- fluidPage(
sidebarPanel(
fileInput("file1", "Import", accept = ".xlsx"),
## replace selectInput with this:
uiOutput("selectCATdyn"),
## end dif
actionButton("goBu", "Click!")
),
mainPanel(
"Display Results",
tableOutput("acBTTON")
)
)
server <- function(input, output, session) {
dat_mt <- eventReactive(input$file1, {
msg("In: dat_mt ...")
req(input$file1)
out <- readxl::read_excel(input$file1$datapath, "mt")
msg("Out: dat_mt ...")
out
})
dat_ir <- eventReactive(input$file1, {
msg("In: dat_ir ...")
req(input$file1)
out <- readxl::read_excel(input$file1$datapath, "ir")
msg("Out: dat_ir ...")
out
})
## replace observeEvent(dat_mt(),... with
output$selectCATdyn <- renderUI({
req(dat_mt(), dat_ir())
selectInput(inputId = "selectCAT", label = "Selection",
choices = c(defcat, sort(unique(dat_mt()$cyl))),
selected = defcat)
})
## end diff
pf <- eventReactive(input$goBu, {
msg("In: event input$goBu ...")
on.exit( msg("Out: event input$goBu ...") )
req(defcat != input$selectCAT, dat_mt(), dat_ir())
mt <- dat_mt()
ir <- dat_ir()
# WARNING: potential for SQL injection, proof-of-concept only
out <- sqldf(paste("select * from mt where cyl =", input$selectCAT))
out
})
output$acBTTON <- renderTable({
msg("In: acBTTN ...")
req(pf())
out <- pf()
msg("Out: acBTTN ...")
out
})
}
在我玩这个游戏的过程中,我意识到了为什么要使用动态UI,所以它现在“更有意义”:-)
不过,请注意:通过静态定义它(如我的第一个解决方案),并在另一个shinyjs::hide
块中使用shinyjs::disable
或observe
,您可以产生类似的效果。
设置:
wb <- openxlsx::createWorkbook()
openxlsx::addWorksheet(wb, "mt")
openxlsx::writeDataTable(wb, "mt", x = mtcars)
openxlsx::addWorksheet(wb, "ir")
openxlsx::writeDataTable(wb, "ir", x = iris)
openxlsx::saveWorkbook(wb, "Johnseito.xlsx")