datatable からフィルタリングされたデータを使用して、ggplot を作成したいと思います。2 つのウィジェットも実装しました。データテーブルをフィルタリングした後、ユーザーは表示する x 軸と y 軸を選択できます。ウィジェットなどを設定した後、エラーが発生しました:
Error in `[.data.frame`(data_melt, filtered_data) : undefined columns selected
なぜこれが起こったのかわかりません。
私のデータ例:
Rundheit Diff Charge Ord..Nr. Block.Nr.
1 0.24 0.20 754331 738 1
2 0.26 0.21 783345 738 2
3 0.25 0.15 795656 738 3
4 NA 0.14 798431 738 4
5 NA 0.12 799651 738 5
6 0.24 NA 805454 738 6
NA値は私のデータにとどまる必要があります
UI:
ui <- dashboardPage(
dashboardHeader(title = "WW"),
dashboardSidebar(
selectizeInput(inputId = "yaxis",
label = "Y-axis (Diagramm)",
choices = list("Rundheit" = "Rundheit",
"Diff" = "Diff"),
selected = c("Rundheit"), multiple=TRUE),
selectInput(inputId = "xaxis",
label = "X-axis (Diagramm)",
choices = names(data_melt),
selected = "Block.Nr.")
),
dashboardBody(
fluidRow(
tabBox(status = "primary", width = NULL, height = "1000px",
tabPanel(title="Tabelle filtern", div(style = 'overflow-y: scroll; max-height: 950px; position:relative;',
dataTableOutput("tabelle"))),
tabPanel("Diagramm", plotOutput("plot1")),
tabPanel("Histogramm", plotOutput("plot2"))))
))
サーバ:
server <- function(input, output, session) {
output$tabelle <- renderDataTable({
datatable(data[, c("Rundheit", "Diff", "Charge.", "Ord..Nr.", "Block.Nr.")], class = 'cell-border stripe',
rownames=FALSE, filter="top",
options = list(lengthChange = FALSE, columnDefs = list(list(width = '200px', targets = "_all"), list(bSortable = FALSE, targets = "_all"))), callback=JS("
//hide column filters for two columns
$.each([0, 1], function(i, v) {
$('input.form-control').eq(v).hide()});",
"var tips = ['Rundheit', 'Diff', 'Charge',
'Ord..Nr.', 'Block.Nr.'],
header = table.columns().header();
for (var i = 0; i < tips.length; i++) {
$(header[i]).attr('title', tips[i]);}")) %>%
formatStyle("Rundheit", color = 'red', backgroundColor = 'lightyellow', fontWeight = 'bold')
})
output$plot1 <- renderPlot({
filtered_data <- input$tabelle_rows_all
data_filt <- data_melt[filtered_data]
ggplot(data=data_filt, aes_string(x = input$xaxis, y = input$yaxis), environment = environment())+ geom_line(aes(group=1), size=1) +
theme(axis.text.y=element_text(size=15), axis.text.x=element_text(size=15), axis.title.x = element_text(size=18, face="bold"),axis.title.y = element_text(size=18, face="bold"))
})
}
shinyApp(ui = ui, server = server)
なぜそれが機能しないのか、そして列を定義する方法を知っている人はいますか?
投稿を見ました:http://stackoverflow.com/questions/30042456/using-filtered-datatables-in-shiny
ただし、コードの場合:
[filtered_data, "name of the column"]
たとえば、次のように使用しても機能しません。
data_filt <- data_melt[filtered_data, ]
Error in seq.int(0, to0 - from, by) : 'to' cannot be NA, NaN or infinite
と
Error in seq.default(from = best$lmin, to = best$lmax, by = best$lstep) :
'from' must be of length 1
としても:
data_filt <- data_melt[filtered_data, input$xaxis]
エラーが発生します(列のタイプによって異なります):
Error : ggplot2 doesn't know how to deal with data of class factor
Error : ggplot2 doesn't know how to deal with data of class numeric
そして、私input$yaxis
も実装する必要があります...したがって、私は試しました:
data_filt <- data_melt[filtered_data, c(input$xaxis, input$yaxis)]
エラーが発生しました
Error in seq.default(from = best$lmin, to = best$lmax, by = best$lstep) :
'from' must be of length 1
このコードで少し遊んだ情報だけで、列の名前を指定してもエラーがスローされ、複数指定することさえできません
私は次のようなことを試しました:
[filtered_data, "Rundheit")
[filtered_data, c("Rundheit", "Diff")]
アイデアをありがとうございました