質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

1回答

1101閲覧

R shiny において、 renderUI で動的に生成したchoices を持つ SelectInput に対するユーザーの選択値をsubmitボタンのeventReactive 内で取得したい。

T.FUSE

総合スコア6

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

1グッド

0クリップ

投稿2023/01/08 11:13

前提

R Shiny で WEBアプリっぽいものを作っています。

RSttudio を使って、Consoleにデバッグ情報を出力させながら開発を進めています。

実現したいこと

selectInput の choices を、動的に生成する必要がありました。そこで、server.R のほうで、 renderUI をおこない、 ui.R で uiOutput で受け取って表示するようにしました。

ui.R では、actionButton を持っており、このボタンを押したときに、 情報を再描画させたいがため、 server.R で eventReactiveで ボタンの押されたことを感知して処理するようにしたいです。

この eventReactive のなかで、 uiOutput で表示敷いている selectInput の値を読み取りたいのです。

発生している問題・エラーメッセージ

eventReactive のなかで、 str(input$select_country と行って、 selectInput の inputid を指定してみましたが・・・

List of 2 $ 0 :List of 2 ..$ jQuery360037919148499739922:List of 2 .. ..$ _shiny_initialized: logi TRUE .. ..$ shinyInputBinding : Named list() ..$ jQuery360037919148499739921:List of 1 .. ..$ events:List of 1 .. .. ..$ change:List of 1 .. .. .. ..$ :List of 4 .. .. .. .. ..$ type : chr "change" .. .. .. .. ..$ origType : chr "change" .. .. .. .. ..$ guid : int 109 .. .. .. .. ..$ namespace: chr "shinysky-select2Input" $ length: int 1

これは、入力情報ではなくて入力UIの在り方情報みたいですね・・・。

該当のソースコード

R

1(sever.R から関連部分抜粋) 2 3shinyServer(function(input, output) { 4 5 output$select_country <- renderUI({ 6 if (is.null(Data()$df)) {return()} 7 else { 8 countryS <- unique(unlist(Data()$df$co)) 9 #str(countryS) 10 selectInput("select_country", label = "Country", choices = countryS) 11 } 12 }) 13 14 Data = eventReactive(input$submit, { 15  str(input$select_country) 16 return("<ここに select_country で選ばれた値を出力したい>") 17 } 18}

R

1(ui.R から関連部分抜粋) 2shinyUI(fluidPage( 3 p("Country"), 4 uiOutput("select_country"), 5 actionButton("submit", "Submit", styleclass = "primary") 6))

試したこと

ui.R 側で記述してしまえる input のアイテムは、 server.R で input で読み取りますので、renderUI と uiOutput の利用の場合も同じようにできるのかな、と思ったのですが、違ったようです。

動的なselectInput choices の使い方がそもそも間違ってるのでしょうか。 renderUI で作らない、とか?

補足情報(FW/ツールのバージョンなど)

R 4.2.2
RSTUDIO-2022.12.0-353-AMD64.DEB

cuttlefish44👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

初稿

(遊び程度でしかshinyを触っていないのでパフォーマンス面などは補償の限りではありません)
selectInputの更新はupdateSelectInputで実行する必要があります。
以下のように、Actionボタンをトリガーにした observeEvent 内で、
各種変数を定義 (selectInputの変更を伴う大きめの処理)、
その変数やinput値を変数にrender関数を記述 (input値の選択に伴う小さめの処理)、
とすることで実現できそうな気がします。

注:ブラウザで開いてください、また初回時はまずsubmitボタンを押してください。

ui.R

library(shiny) fluidPage( titlePanel("Example"), sidebarLayout( sidebarPanel( selectInput('runif_value', 'Runif_value', ""), actionButton("submit", "Submit") ), mainPanel( textOutput("output_text") ) ) )

server.R

library(shiny) function(input, output, session) { observeEvent(input$submit, { out_var <- sort(sample(100, 5)) # アクションボタン連動で更新 output$output_text <- renderText({ paste0("選択肢: ", paste(out_var, collapse = ","), "選択: ", input$runif_value) }) # selectInput連動で更新 updateSelectInput(session, "runif_value", choices = out_var) # out_var連動, つまりアクションボタン連動で更新 }) }

二稿

理解が不十分で申し訳ありません。

ユーザーが submit で送信する selected value を 得たい

ということでしたら、アクションボタンをkeyにしたeventReactiveで、
input$select_country を用いて変数 (関数) を定義し、
各種renderxx系でoutputに突っ込むだけでいける気がします。
(条件がよくわからなかったため、以下例ではchoiceは動的にはしていません)

ui.R

library(shiny) fluidPage( titlePanel("Example"), sidebarLayout( sidebarPanel( uiOutput("select_country"), actionButton("submit", "Submit") ), mainPanel( textOutput("output_text") ) ) )

server.R

library(shiny) function(input, output, session) { output$select_country <- renderUI({ #if (is.null(Data()$df)) {return()} #else { countryS <- unique(iris$Species) #str(countryS) selectInput("select_country", label = "Country", choices = countryS) #} }) Data <- eventReactive(input$submit, { return(paste0(input$select_country, " is selected.")) }) output$output_text <- renderText({Data()}) }

投稿2023/01/11 04:18

編集2023/01/12 02:07
cuttlefish44

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.FUSE

2023/01/11 12:15

回答ありがとうございます。 たぶん、私の質問の表現がわるかったのでしょう・・・ updateしたいのではなくて、 HTMLで言うところの、ユーザーが submit で送信する selected value を 得たいのです。「ユーザーが何を選択しているか」 selct input の値です。 choices を更新するときは、updateInputする、ということで理解しました。 ありがとうございました。
cuttlefish44

2023/01/12 02:09

理解及んでおらず恐縮です (まだきちんと理解できているか怪しいですが) 2稿を追加しました アクションボタンをトリガーとするeventReactiveでinput$select_countryを用いた変数(関数)を定義し、 その出力をoutput$hoge に renderhogeで代入することで実現できそうな気がします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問