2016-12-20 3 views
1

Я использую фрейм данных для приема входов от пользовательского интерфейса. Для упрощения предположим, что это 2 строки и 2 столбца. Основываясь на данных, я хотел бы рассказать о распределении. Задача состоит в том, что мне нужно, чтобы дистрибутивы представлялись одинаково, т. Е. В формате «матрицы».R Блестящая гистограмма как элементы renderTable

Ниже приведен пример воспроизводимости. То, что я понимаю из сообщений об ошибках, следующее: после ввода данных во входную матрицу принимающая матрица не может заменить свои элементы (которые являются числовыми в целом) графиками. Вероятно, я должен сказать получающему фрейму данных, что его элементы не будут «стандартными», но я не знаю, как это сделать. Кроме того, возможно, я должен использовать javascript или html для определения гистограмм?

Вот упрощенная версия моего ui.R и server.R:

ui.R:

shinyUI(navbarPage(
    "My Application", 
    tabPanel("Component 1", 
     fluidPage(

     tableOutput('decision_Matrix'), 

     tableOutput('decision_Matrix_plots') 
     )), 
tabPanel("Component 2") 
)) 

server.R:

shinyServer(

function(input, output) { 

output$decision_Matrix <- renderTable({ 

    matrix_input <- matrix(data=NA, nrow=2,ncol=2) 

    for (j in 1:2) { 
    for (i in 1:2) { 

     matrix_input[i,j] <- paste0("<input id='C", j, "_A", i, "' type='number' class='form-control shiny-bound-input' value='", input[[paste0("C", j, "_A", i)]], "'>") 

    } 
    } 

    rownames(matrix_input) <- c("alt1","alt2") 
    colnames(matrix_input) <- c("crit1","crit2") 

    matrix_input 

},include.rownames=TRUE, sanitize.text.function = function(x) x) 

output$decision_Matrix_plots <- renderTable({ 

    matrix_plots <- data.frame() 

    for (j in 1:2) { 
    for (i in 1:2) { 

     n <- input[[paste0("C", j,"_A",i)]] 

     matrix_plots[i,j] <- hist(rnorm(n),breaks=10) # here is where it is not correct I think 

    }} 

    matrix_plots 
}) 

}) 

Любая помощь будет значительно оценили.

Спасибо!

H

enter image description here

+0

Вы можете установить точки останова, чтобы увидеть, что значение и класс 'n' есть. – Jean

+0

Непонятно, какое именно значение вы хотите иметь в matrix_plots [i, j]. –

ответ

1

мне не пришлось бы исследовать, как много, если вы использовали ggplot (я бы просто использовал grid.arrange), но это оказалось довольно просто слишком.

Обратите внимание, что я изменил ваш второй renderTable на renderPlot. Также я организовал вашу базовую графику с помощью layout, а затем воспользовался функцией gridBase под названием recordPlot, чтобы преобразовать базовую графику в сюжет сетки и вернуть ее.

По запросу я также масштабировал график шириной 800 пикселей и добавил стиль CSS на renderTable для соответствия.

library(shiny) 
library(grid) 
library(gridBase) 

u <- shinyUI(navbarPage(
    "My Application", 
    tabPanel("Component 1", 
     fluidPage(
     tableOutput('decision_Matrix'), 
     tags$head(tags$style("#decision_Matrix table {background-color: lightgray; width: 800px; }",media = "screen",type = "text/css")), 
     plotOutput('decision_Matrix_plots') 
     )), 
tabPanel("Component 2") 
)) 

s <- shinyServer(

function(input,output) { 

    output$decision_Matrix <- renderTable({ 
    matrix_input <- matrix(data = NA,nrow = 2,ncol = 2) 
    for (j in 1:2) { 
     for (i in 1:2) { 
     matrix_input[i,j] <- paste0("<input id='C",j,"_A",i,"' type='number' class='form-control shiny-bound-input' value='",input[[paste0("C",j,"_A",i)]],"'>") 
     } 
    } 
    rownames(matrix_input) <- c("alt1","alt2") 
    colnames(matrix_input) <- c("crit1","crit2") 
    matrix_input 
    },include.rownames = TRUE,sanitize.text.function = function(x) x) 

    output$decision_Matrix_plots <- renderPlot(width=800,height=500,{ 
    layout(matrix(c(1,2,3,4),nrow = 2,ncol = 2)) 
    for (j in 1:2) { 
     for (i in 1:2) { 
     set.seed(123) 
     n <- input[[paste0("C",j,"_A",i)]] 
     if (is.null(n) || is.na(n) || n < 1) n <- 1 
     hist(rnorm(n),breaks = 10,main=sprintf("histogram of rnorm(%d)",n)) 
     } 
    } 
    recordPlot() 
    }) 
}) 
shinyApp(ui = u,server = s) 

Уступая:

enter image description here

+0

Большое спасибо Майку Уайзу. Это действительно хорошо работает. Я думал об использовании renderTable вместо renderPlot, так что графики имели бы такое же измерение по горизонтали, как и входная матрица. На данный момент графики намного шире, чем входные данные в верхней части страницы. Я полагаю, я могу использовать fluidPage и столбец, чтобы убедиться, что они выравниваются? – user1431694

+1

Я скорректировал ширину двух элементов одинаковыми, «renderTable» с командами CSS и «renderPlot», указав размер изображения. Есть и другие способы сделать это, но это самые простые, я думаю, не получая всю бутстрапию. –

+0

Это элегантное решение! – user1431694

Смежные вопросы