光沢のあるアプリ (RStudio による) では、サーバー側に、の内容を解析して変数のリストを返すリアクティブがありますtextInput
。変数のリストは、selectInput
および/またはで使用されupdateSelectInput
ます。
私はそれを機能させることはできません。助言がありますか?
私は2つの試みをしました。最初のアプローチは、リアクティブoutVar
を に直接使用することselectInput
です。2 番目のアプローチは、リアクティブを使用することoutVar
ですupdateSelectInput
。どちらも機能しません。
サーバー.R
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)
})
})
ui.R
shinyUI(
basicPage(
uiOutput("inBody"),
uiOutput("inVar")
)
)
少し前に、shiny-discuss に同じ質問を投稿しましたが、あまり関心がなかったので、お詫びを込めてもう一度質問します。議論/e0MgmMskfWo
編集 1
@Ramnath は、彼によってEdit 2と示されている、機能しているように見えるソリューションを親切に投稿しました。しかし、私の問題のように側面ではなく側面にあるtextinput
ため、その解決策は問題に対処しません。Ramnath の 2 番目の編集を横に移動すると、問題が再び発生します。つまり、何も表示されず、RStudio がクラッシュします。ラップすると問題がなくなることがわかりました。ui
server
textinput
server
input$text
as.character
編集 2
outVar
さらなる議論の中で、Ramnath は、引数が によって返される前にサーバーが動的関数を適用しようとすると問題が発生することを示しましたtextinput
。解決策は、最初にis.null(input$inBody)
存在するかどうかを確認することです。
引数の存在を確認することは、光沢のあるアプリを構築するための重要な側面ですが、なぜそれを考えなかったのですか? ええ、そうしましたが、何か悪いことをしたに違いありません。私がその問題に費やした時間を考えると、それは苦い経験です. コードの後に、存在を確認する方法を示します。
textinput
以下は横に移動したRamnath のコード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 のチェックはより直接的です。
最後に、さまざまなデバッグの試みについて、いくつかの点に注意したいと思います。
私のデバッグクエストで、サーバー側で「出力」の優先度を「ランク付け」するオプションがあることを発見しました。これは、問題を解決するために調査しましたが、問題が別の場所にあったため機能しませんでした。それでも、知ることは興味深いことであり、現時点ではあまり知られていないようです:
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)))
なぜそれが機能したのかを知ることは興味深いと思います.それは物事を十分に遅くするからですか? 非nullになるのをas.character
「待つ」からですか?input$text
いずれにせよ、ラムナスの努力、忍耐、指導に心から感謝しています。