shinyTreeを使用してデータテーブルをレンダリングしています。以下は、これまでに使用されたコードを含むデータセットです。
library(shiny)
library(shinyTree)
newdat <- structure(list(RESPID = c("41000123", "41004132", "41006132",
"41007121", "41007123"), PDT_A = c(125, 66, 45, 28,
0), PDT_B = c(10, 0, 0, 0, 0), PDT_C = c(0, 0, 0, 0, 0), PDT_D = c(450,
105, 75, 192, 0), PDT_TOTAL = c(585, 171, 120, 220, 0)), .Names = c("RESPID",
"PDT_A", "PDT_B", "PDT_C", "PDT_D", "PDT_TOTAL"), row.names = c("6",
"40", "56", "59", "61"), class = "data.frame")
server <- shinyServer(function(input, output, session) {
newdata <- reactive({newdat})
output$tree <- renderTree({
sss=list('TOTAL_VALUE'= list('TOTAL_VALUE_OF_MERCHANDISE' = structure(list('PDT_TOTAL'='1001'), stopened=FALSE),
'PDT_CAT' = structure(list('PDT_TOTAL'='1002','PDT_A'='152','PDT_B'='153','PDT_C'='154','PDT_D'='155'), stopened=FALSE)
))
attr(sss[[1]],"stopened")=FALSE
sss
})
catdat <- reactive({
tree <- input$tree
unlist(get_selected(tree))
})
coldat <- reactive({
newdata()[,catdat()]
})
output$datatab <- renderDataTable({
coldat()
})
})
ui <- shinyUI(
pageWithSidebar(
headerPanel("TEST"),
sidebarPanel(
shinyTree("tree", checkbox = TRUE)
),
mainPanel(
dataTableOutput("datatab")
)
))
shinyApp(ui,server)
ツリーが生成されます。データテーブルの出力を介して列をレンダリングする際に、次の問題が発生します。
ツリーの最初のブランチは、1つの列のみを参照します。これは光沢のあるレンダリングではありません。エラーメッセージが表示されますundefined columns selected
。
テーブルの5列すべてをレンダリングすることになっているツリーの2番目のブランチ。ただし、レンダリングされるのは4つの列のみです。
2番目のブランチのルートを選択すると、同じ結果が得られundefined columns selected
ます。ブランチの1つをオフにすると、4列のテーブルがレンダリングされます。
すべての列をレンダリングするにはどうすればよいですか?ブランチルート/ノードレベルでチェックボックスを削除する方法はありますか?
広告1.ツリーの最初のブランチを選択するcatdat()
と"PDT_TOTAL"
、"TOTAL_VALUE_OF_MERCHANDISE"
とを使用してベクトルが返さ"TOTAL_VALUE_OF_MERCHANDISE"
れ、データセットにそのような変数がないため、このエラーが発生します。
広告2.5つのオプションをすべて選択すると、さらにcatdat()
戻り"PDT_CAT"
、上記と同じ問題が発生します。データセットにそのような変数はありません。(上記と同じ-すべてのオプションを選択すると、"PDT_TOTAL"
追加で返されます"TOTAL_VALUE_OF_MERCHANDISE"
)
すべての列をレンダリングするには、次のようにします。
まず、データセットから動的に変数を選択し、最初のオプションが選択されたときにcatdat()
2回返されるように重複を削除します。"TOTAL_VALUE"
TOTAL_VALUE
別の問題もありnewdata()[,vars]
ます。選択された変数が1つしかない場合にベクトルを返し、renderDataTable
データフレームでのみ機能するため何も出力しません。この問題に対処,
するには、削除して、サブセットが常にデータフレームを返すようにすることができます-newdata()[vars]
coldat <- reactive({
vars <- catdat()
vars <- vars[!(vars %in% c("TOTAL_VALUE", "TOTAL_VALUE_OF_MERCHANDISE", "PDT_CAT"))]
vars <- unique(vars)
print(vars)
# newdata()[,vars] # If you select only one variable then this reactive returns an object of class numeric and not a data.frame
newdata()[vars] # remove "," and it will always return a data frame
})
完全な例:
library(shiny)
library(shinyTree)
newdat <- structure(list(RESPID = c("41000123", "41004132", "41006132",
"41007121", "41007123"), PDT_A = c(125, 66, 45, 28,
0), PDT_B = c(10, 0, 0, 0, 0), PDT_C = c(0, 0, 0, 0, 0), PDT_D = c(450,
105, 75, 192, 0), PDT_TOTAL = c(585, 171, 120, 220, 0)), .Names = c("RESPID",
"PDT_A", "PDT_B", "PDT_C", "PDT_D", "PDT_TOTAL"), row.names = c("6",
"40", "56", "59", "61"), class = "data.frame")
server <- shinyServer(function(input, output, session) {
newdata <- reactive({newdat})
output$tree <- renderTree({
sss=list('TOTAL_VALUE'= list('TOTAL_VALUE_OF_MERCHANDISE' = structure(list('PDT_TOTAL'='1001'), stopened=FALSE),
'PDT_CAT' = structure(list('PDT_TOTAL'='1002','PDT_A'='152','PDT_B'='153','PDT_C'='154','PDT_D'='155'), stopened=FALSE)
))
attr(sss[[1]],"stopened")=FALSE
sss
})
catdat <- reactive({
tree <- input$tree
unlist(get_selected(tree))
})
coldat <- reactive({
vars <- catdat()
vars <- vars[!(vars %in% c("TOTAL_VALUE", "TOTAL_VALUE_OF_MERCHANDISE", "PDT_CAT"))]
vars <- unique(vars)
print(vars)
# newdata()[,vars] # If you select only one variable then this reactive returns an object of class numeric and not a data.frame
newdata()[vars] # remove "," and it will always return a data frame
})
output$datatab <- renderDataTable({
coldat()
})
})
ui <- shinyUI(
pageWithSidebar(
headerPanel("TEST"),
sidebarPanel(
shinyTree("tree", checkbox = TRUE)
),
mainPanel(
dataTableOutput("datatab")
)
))
shinyApp(ui,server)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加