2016-03-01 1 views
0

У меня есть R-скрипт, для которого мне нужно разработать и установить интерфейс пользователя в пакете shiny в R.Невозможно разобраться, как создать и запустить определенную пользователем функцию R в Shiny с текстовыми полями ввода

Моя следующая является частью R кода, который я пытаюсь построить интерфейс вокруг:

# A random normal function to generate numbers with exact mean and SD 
rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) } 
age <- rnorm2(n = 10000, mean = 55 , sd = 15) 
cholestrol <- rnorm2(n = 10000, mean = 200 , sd = 30) 
bp <- rnorm2(n = 10000, mean = 90 , sd = 25) 
df <- cbind(age, cholestrol,bp) 
Org_Data <- as.data.frame(df) 

Как есть 9 входов (3 каждый для age, cholestrol и bp) я создал 9 полей ввода в котором пользователь вводит вход, а затем нажатием кнопки Я хочу запустить rnorm2 который я создал.

Мой блестящий код приложения выглядит следующим образом:

ui.R:

library(shiny) 
shinyUI(pageWithSidebar(
    headerPanel("function1"), 

    sidebarPanel( 
     #Age input 
     textInput(inputId = "n1", 
       label = h4("Enter n for Age:"), 
       value = ""), 

     textInput(inputId = "mean1", 
       label = h4("Enter mean for Age:"), 
       value = ""), 

     textInput(inputId = "sd1", 
       label = h4("Enter sd for Age:"), 
       value = ""), 

     #Cholestrol input 
     textInput(inputId = "n1", 
       label = h4("Enter n for Cholestrol:"), 
       value = ""), 

     textInput(inputId = "mean1", 
       label = h4("Enter mean for Cholestrol:"), 
       value = ""), 

     textInput(inputId = "sd1", 
       label = h4("Enter sd for Cholestrol:"), 
       value = ""), 


     #Blood Pressure input 
     textInput(inputId = "n1", 
       label = h4("Enter n for Blood Pressure:"), 
       value = ""), 

     textInput(inputId = "mean1", 
       label = h4("Enter mean for Blood Pressure:"), 
       value = ""), 

     textInput(inputId = "sd1", 
       label = h4("Enter sd for Blood Pressure:"), 
       value = ""), 


     actionButton(inputId = "input_action", label = "Show Inputs")), 



    mainPanel( 
     h2("Input Elements"), # title with HTML helper 
     textOutput("td")) 


)) 

Но я совершенно беспомощен выяснить, как поставить R-код, я уже упоминал в начале в server.R файл. Могу ли я начать с простого определения функции? А затем, как запустить эту функцию на тех входах, взятых у пользователя, а затем сохранить вывод в каждой из этих переменных: age, cholestrol и bp ???

server.R:

library(shiny) 

#defining a function 
rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) } 

shinyServer(function(input, output){ 

    #Don't know how run the function and save the output into the variables 
    age <- 
    cholestrol <- 
    bp <- 


    }) 

}) 

Это мой первый день с блестящими и все образцы server.R кода в Интернете являются своего рода собираются над моей головой. Но мне действительно нужно это сделать сегодня. Пожалуйста помоги!!!

ответ

2

Единственная зависимость, которую я добавил, была library(DT), которая является исключительно полезным пакетом.

Вы заметите, что вам нужно сделать уникальные идентификаторы входа в ui.R и использовать eventReactive, чтобы дать команду блестящему подождать кнопку ввода.

ui.R

library(shiny) 
library(DT) 
shinyUI(pageWithSidebar(
    headerPanel("function1"), 

    sidebarPanel( 
    #Age input 
    numericInput(inputId = "n", 
       label = h4("Enter n:"), 
       value = ""), 

    numericInput(inputId = "mean1", 
       label = h4("Enter mean for Age:"), 
       value = ""), 

    numericInput(inputId = "sd1", 
       label = h4("Enter sd for Age:"), 
       value = ""), 

    #Cholestrol input   
    numericInput(inputId = "mean2", 
       label = h4("Enter mean for Cholestrol:"), 
       value = ""), 

    numericInput(inputId = "sd2", 
       label = h4("Enter sd for Cholestrol:"), 
       value = ""), 


    #Blood Pressure input 
    numericInput(inputId = "mean3", 
       label = h4("Enter mean for Blood Pressure:"), 
       value = ""), 

    numericInput(inputId = "sd3", 
       label = h4("Enter sd for Blood Pressure:"), 
       value = ""), 


    actionButton(inputId = "input_action", label = "Show Inputs")), 



    mainPanel( 
    h2("Input Elements"), # title with HTML helper 
    dataTableOutput("inputs"), 
    h2("Results"), 
    dataTableOutput("results") 
))) 

server.R

library(shiny) 
library(DT) 

rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) } 

shinyServer(function(input, output){ 

    data <- eventReactive(input$input_action, { 
    matrix(
     c(rnorm2(input$n, input$mean1, input$sd1), 
     rnorm2(input$n, input$mean2, input$sd2), 
     rnorm2(input$n, input$mean3, input$sd3)), byrow = FALSE, 
     ncol = 3) 
    }) 

    inpts <- eventReactive(input$input_action, { 
    data.frame(Type = c("Age", "Cholestorol", "BP"), 
       N = c(input$n, input$n, input$n), 
       Mean = c(input$mean1, input$mean2, input$mean3), 
       SD = c(input$sd1, input$sd2, input$sd3)) 
    }) 

    output$inputs <- renderDataTable({ 
    inpts() 
    }) 
    output$results <- renderDataTable({ 
    set <- as.data.frame(data()) 
    colnames(set) <- c("Age", "BP", "Cholestorol") 
    set 
    }) 

}) 
+0

Вау .. это было красиво .. Большое спасибо! – LearneR

+0

Кроме того, я попытался объединить все три переменные под одной dataframe: full_df <- eventReactive (вход $ input_action, { data.frame (age_r, chol_r, bp_r) }) выход $ full_df_r <- renderDataTable ({ full_df() }) Но это не было распознавание 'age_r', я не могу использовать этот age_r из' output $ age_r' в качестве вектора 'age_r' ?? – LearneR

+0

Есть ли способ объединить все эти 3 переменные 'age',' cholestrol' и 'bp' в один фрейм данных на сервере.R ?? Как это сделать? – LearneR