1

I am working on a shiny app, where I need input values to show up in a function.

What I am trying to do is to somehow extract names and values from input, like CL=4, V1=3, and feed them in a function that I need to feed into a model in server later on. The model I am working on only takes function format. Below is my code.

UI:

#Set up
rm(list=ls())

library(shiny)
library(shinydashboard)
library(shinyBS)
library(dplyr)

#Design sidebar
sidebar <- dashboardSidebar(width = 200, collapsed=TRUE,
                            sidebarMenu(id="tabs",
                                        menuItem("Simulations", tabName = "Sims", icon = icon("line-chart"), selected=TRUE),
                                        menuItem("Placeholder", tabName = "Place", icon = icon("square-o"))
                            ))

#Design body 
body <- dashboardBody(
  tabItems(
    tabItem(tabName = "Sims", 
            box(collapsible=TRUE, width = 3, status = "success", solidHeader = T, title="Select Your Model",
                radioButtons(inputId="PK_Model", label = "PK Model", selected="One_Comp", 
                             choices = c("1 Compartment"="One_Comp", "2 Compartment"="Two_Comp")),
                radioButtons(inputId="Clearance_Model",label ="Clearance Mechanism", selected="Linear", 
                             choices = c("Linear"="Linear"))),
            box(collapsible=TRUE, status = "success", solidHeader = T, title="Enter Parameter Estimates", 
                        conditionalPanel(condition = "input.Clearance_Model == 'Linear'",
                                          numericInput(label="Clearance (Linear) (CL; L/day)", inputId="CL", min = 0, max = NA, value = 0),
                                          numericInput(label="Central volume of distribution (V1; L)", inputId="V1", min = 0, max = NA, value = 0)),
                         conditionalPanel(condition = "input.PK_Model == 'Two_Comp'",
                                          numericInput(label="Inter-compartment clearance (Q; L/day)", inputId="Q", min = 0, max = NA, value = 0),
                                          numericInput(label="Peripheral volume of distribution (V2; L)", inputId="V2", min = 0, max = NA, value = 0))),
              box(collapsible=T, width=2, status = "success", solidHeader = T, title="Run",
                actionButton('gosim','Run Sims',class='btn btn-info', icon=icon('play-circle-o','fg-lg'))), 
              box(width=5, status = "success", solidHeader = T, title="Simulated", textOutput('testprint')))))

#Show title and the page (includes sidebar and body)
dashboardPage(skin=c("blue"),
              dashboardHeader(titleWidth=900, title = "Shiny Test"),
              sidebar,  body)

UPDATED: Following PoGibas's answer below, I updated server code to following, but result does not look like what I need.

Server:

    library(shiny)
    library(shinydashboard)
    library(shinyBS)
    library(RxODE)
    library(parallel)
    library(ggplot2)

test <- function (N1, N2, N3, N4) {
  mypar <- function(lKa, lKdeg, N1, N2, N3, N4){
    Ka=exp(lKa)
    Kdeg=exp(lKdeg)
    V1=N1
    CL=N2
    Q=N3
    V2=N4}
  return(mypar)
}

    shinyServer(function(input, output, session){

 mypar <-eventReactive(input$goSimPH20, {
  N1=as.numeric(input$V1)
  N2=as.numeric(input$CL)
  N3=as.numeric(input$Q)
  N4=as.numeric(input$V2)
  par1 = test(N1, N2, N3, N4)
  return(par1)
})

        output$testprint <- renderText(mypar())  

        })

What I need result to look like when I call mypar() within server is as below:

test <- function (lKa, lKdeg, V1, CL, Q, V2) {
            Ka=exp(lKa)
            Kdeg=exp(lKdeg)
            V1=xx
            V2=xx
            CL=xx
            Q=xx
            }

xx can be any user supplied value in UI.

3
  • if my solution helped to solve your problem you can accept the answer so we can close the question :) Commented Sep 22, 2017 at 21:35
  • Please rewrite your code to be a minimal example. stackoverflow.com/help/mcve Commented Jan 17, 2018 at 10:35
  • @Krina can you please accept the answer if it helped to solve your problem? Commented Jan 17, 2018 at 11:02

1 Answer 1

4

I simplified server part to this:

test <- function (V1 = 1, CL = 2, lA = 1, lB = 2) {
    return(lA + lB + V1 + CL)
}

shinyServer(function(input, output, session) {
    mypar <- reactive({
        V1 = as.numeric(input$V1)
        CL = as.numeric(input$CL)
        return(test(V1, CL))
    })
    output$testprint <- renderText(mypar())  
})

In test function add your wanted formula. User input is extracted using V1 = as.numeric(input$V1) and passed to test using test(V1, CL).

Sign up to request clarification or add additional context in comments.

1 Comment

thanks for your response. I am still struggling with this. What I need in return from calling mypar is a function that looks like below: test <- function (lA, lB,...) { A=exp(lA) B=exp(lB) V1=xx V2=xx CL=xx Q=xx } I tried several different ways using your suggested approach, but no luck yet.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.