[解決済み] selectInputの選択肢に反応的に渡すRの輝き
質問
RStudioによる)シャイニーアプリで、(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に同じ質問を投稿しましたが、ほとんど関心を持たれなかったので、申し訳ありませんが、再度質問させていただきます。 https://groups.google.com/forum/#!topic/shiny-discuss/e0MgmMskfWo
編集1
Ramnath が親切にも、うまくいくように見える解決策を投稿してくれました。
編集 2
という解決策を投稿してくれました。しかし、その解決策は問題を解決するものではありません。
textinput
が
ui
側ではなく
server
側ではなく、私の問題のように もし私が
textinput
に移動させると、Ramnathの2番目の編集は
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のチェックはより直接的です。
最後に、私のさまざまなデバッグの試みについて、2、3のことを書き留めておきたいと思います。
デバッグの探求において、サーバー側で "output" の優先度をランク付けするオプションがあることを発見し、私の問題を解決しようとして調査しましたが、問題は他の場所にあったのでうまくいきませんでした。それでも、知ることは興味深いことで、現時点ではあまり知られていないようです。
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
が非NULLになるのを待つのですか?
何はともあれ、Ramnathの努力、忍耐、指導に非常に感謝しています。
どのように解決するのですか?
この場合
renderUI
をサーバ側で使用する必要があります。ここに最小限の例があります。2番目のドロップダウンメニューは反応型で、最初のメニューで選択したデータセットに適応することに注意してください。もしあなたがshinyを扱ったことがあるなら、このコードは自明なはずです。
runApp(list(
ui = bootstrapPage(
selectInput('dataset', 'Choose Dataset', c('mtcars', 'iris')),
uiOutput('columns')
),
server = function(input, output){
output$columns = renderUI({
mydata = get(input$dataset)
selectInput('columns2', 'Columns', names(mydata))
})
}
))
EDIT. を使用した別の解決策
updateSelectInput
runApp(list(
ui = bootstrapPage(
selectInput('dataset', 'Choose Dataset', c('mtcars', 'iris')),
selectInput('columns', 'Columns', "")
),
server = function(input, output, session){
outVar = reactive({
mydata = get(input$dataset)
names(mydata)
})
observe({
updateSelectInput(session, "columns",
choices = outVar()
)})
}
))
EDIT2:
parse
. このアプリでは、入力されたテキスト式を使って、下のドロップダウンメニューに変数のリストが動的に入力されます。
library(shiny)
runApp(list(
ui = bootstrapPage(
textInput("text", "Enter Formula", "a=b+c"),
uiOutput('variables')
),
server = function(input, output){
outVar <- reactive({
vars <- all.vars(parse(text = input$text))
vars <- as.list(vars)
return(vars)
})
output$variables = renderUI({
selectInput('variables2', 'Variables', outVar())
})
}
))
関連
-
R: hclust(d, method = method)でのエラー : 外部関数呼び出しは NA/NaN/Inf(arg10) を持つことができません。
-
R - よくあるエラーとその原因 - 注意事項
-
[解決策】 plot.new() のエラー:図の余白が大きすぎる。
-
[解決済み] "エラーです。Rでテーマの書式を保存する際に「Don't know how to add RHS to the theme object」(テーマオブジェクトにRHSを追加する方法がわかりません)と表示されます。
-
[解決済み] Rの%*%の意味 [重複]について
-
[解決済み] リストをデータフレームに変換する
-
[解決済み】RでCRANミラーを選択する方法
-
[解決済み】data.frameのグループごとの平均値【重複】について
-
[解決済み】私のggplot2構文が賢明であるときに、R CMDチェック「no visible binding for global variable」注記を処理するにはどうすればよいですか?
-
[解決済み] FUN内のlapplyインデックス名へのアクセス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
R: hclust(d, method = method)でのエラー : 外部関数呼び出しは NA/NaN/Inf(arg10) を持つことができません。
-
R LanguageError in hist.default() : 'x' は数値でなければなりません.
-
R plot.new() のエラー : 図形の余白が大きすぎる
-
データボックス内の行/列の削除/追加を行うR言語
-
[解決済み] Rの二乗偏差の総和の算出
-
[解決済み] グループ化関数(tapply、by、aggregate)と*applyファミリ
-
[解決済み] リストをデータフレームに変換する
-
[解決済み] データフレーム内の列を名前でドロップする方法
-
[解決済み] ggplot2 の棒グラフで棒を並べる
-
[解決済み】ifelse()でDateオブジェクトがnumericオブジェクトにならないようにする方法