在服务器端的一个闪亮的应用程序中(通过RStudio),我有一个反应式,可以通过解析a的内容来返回变量列表textInput
。然后在selectInput
和/或中使用变量列表updateSelectInput
。
我不能使它工作。有什么建议?
我做了两次尝试。第一种方法是outVar
直接使用反应堆selectInput
。第二种方法是使用反应性outVar
在updateSelectInput
。都不行。
服务器
shinyServer(
function(input, output, session) {
outVar <- reactive({
vars <- all.vars(parse(text=input$inBody))
vars <- as.list(vars)
return(vars)
})
output$inBody <- renderUI({
textInput(inputId = "inBody", label = h4("Enter a function:"), value = "a+b+c")
})
output$inVar <- renderUI({ ## works but the choices are non-reactive
selectInput(inputId = "inVar", label = h4("Select variables:"), choices = list("a","b"))
})
observe({ ## doesn't work
choices <- outVar()
updateSelectInput(session = session, inputId = "inVar", choices = choices)
})
})
用户界面
shinyUI(
basicPage(
uiOutput("inBody"),
uiOutput("inVar")
)
)
不久前,我在发亮的讨论中发布了相同的问题,但是它引起的兴趣不大,所以我再次道歉,https: //groups.google.com/forum/#!topic / shiny-讨论/ e0MgmMskfWo
编辑1
@Ramnath友好地发布了一个似乎有效的解决方案,他表示为Edit 2。但是该解决方案无法解决问题,因为该问题在我的问题textinput
的ui
侧面而不是server
侧面。如果我将textinput
Ramnath的第二个编辑的内容移到server
侧面,问题会再次出现,即:什么都没有显示,并且RStudio崩溃。我发现,包裹input$text
在as.character
使问题消失。
编辑2
在进一步的讨论中,Ramnath向我展示了当服务器尝试outVar
在其参数由返回之前应用动态函数时,就会出现问题textinput
。解决的办法是先检查是否is.null(input$inBody)
存在。
检查参数是否存在是构建闪亮应用程序的关键方面,那么为什么我没有想到呢?好吧,我做到了,但是我一定做错了!考虑到我在此问题上花费的时间,这是一次痛苦的经历。我在代码之后显示如何检查是否存在。
下面是Ramnath的代码,textinput
移到了server
一边。它使RStudio崩溃,因此请勿在家中尝试。(我用他的符号)
library(shiny)
runApp(list(
ui = bootstrapPage(
uiOutput('textbox'), ## moving Ramnath's textinput to the server side
uiOutput('variables')
),
server = function(input, output){
outVar <- reactive({
vars <- all.vars(parse(text = input$text)) ## existence check needed here to prevent a crash
vars <- as.list(vars)
return(vars)
})
output$textbox = renderUI({
textInput("text", "Enter Formula", "a=b+c")
})
output$variables = renderUI({
selectInput('variables2', 'Variables', outVar())
})
}
))
我通常检查存在性的方式是这样的:
if (is.null(input$text) || is.na(input$text)){
return()
} else {
vars <- all.vars(parse(text = input$text))
return(vars)
}
Ramnath的代码更短:
if (!is.null(mytext)){
mytext = input$text
vars <- all.vars(parse(text = mytext))
return(vars)
}
两者似乎都可以工作,但是从现在起我将按照Ramnath的方式进行操作:也许结构中的不平衡支架早些时候使我无法进行检查工作?Ramnath的支票更为直接。
最后,我想说明一些有关各种调试尝试的信息。
在我的调试任务中,我发现有一个选项可以在服务器端对“输出”的优先级进行“排序”,这是我尝试解决问题的方法,但由于该问题在其他地方而没有用。不过,仍然很有趣,并且目前似乎还不是很了解:
outputOptions(output, "textbox", priority = 1)
outputOptions(output, "variables", priority = 2)
在该任务中,我还尝试了 try
:
try(vars <- all.vars(parse(text = input$text)))
那已经很接近了,但是仍然没有解决。
我偶然发现的第一个解决方案是:
vars <- all.vars(parse(text = as.character(input$text)))
我想知道它为什么起作用会很有趣:是因为它使事情变慢了吗?是因为as.character
“等待”input$text
为非空吗?
无论情况如何,我都非常感谢拉姆纳特的努力,耐心和指导。
renderUI
用于动态更改的输入元素。在您的情况下,textInput
最好将UI放置在UI中,因为其中不涉及动态元素。