Я пытаюсь написать приложение для работы, чтобы некоторые простые советы для пациентов по определенным лекарствам были представлены в формате с возможностью добавления дополнительного текста. Я огляделся, чтобы узнать, есть ли способ экспортировать текст и данные в pdf, чтобы мы могли его распечатать, но пока безуспешно. Это код для приложения:
library(tidyverse)
library(shiny)
library(shinythemes)
library(xtable)
insulin <- readRDS("insulin.rda")
# User Interface
ui <- fluidPage(
titlePanel("Pre-operative Advice on Insulin - For Patients with Diabetes Undergoing Elective Surgery v0.1"),
p("Please refer to Guideline on Shared Drive or Intranet for full guidance"),
sidebarLayout(
sidebarPanel(
p("Patient Name and Date of Birth (Optional)"),
textInput("px_name", label = "Patient Name", placeholder = "Patient Name"),
textInput("dob", label = "Date of Birth or CHI", placeholder = "Date of Birth or CHI"),
selectInput("DM", "What type of diabetes does patient have?",
c("Type One" = "Type 1",
"Type Two on Insulin" = "Type 2"),
selected = "Type One"),
selectInput("time", "Is patient on morning or afternoon list?",
c("Morning List" = "AM",
"Afternoon List" = "PM"),
selected = "Morning"),
checkboxGroupInput("class", "Which type(s) of insulin is patient on?",
c("Long and Intermediate acting",
"Pre-Mixed",
"Rapid or Short acting"))
),
mainPanel(
uiOutput("insulin_sel"),
h3(textOutput(outputId = "px_name")),
br(),
h4(textOutput(outputId = "dob")),
br(),
tableOutput("table"),
)
)
)
server <- function(input, output){
output$px_name <- renderText({input$px_name})
output$dob <- renderText({input$dob})
output$insulin_sel <- renderUI({
insulin_subset <- insulin %>% filter(DM == input$DM,
Time == input$time,
Class %in% input$class)
selectizeInput("name", "Type in name of insulin",
choices = list("Type in insulin name" = "",
"Names" = insulin_subset$Name),
selected = NULL,
multiple = TRUE,
options = NULL)
})
output$table <- renderTable({
insulin_subset <- insulin %>% filter(DM == input$DM,
Time == input$time,
Class %in% input$class)
tab <- insulin_subset %>% filter(Name %in% input$name)
xtable(tab)
})
}
shinyApp(ui = ui, server = server)
Это часть инструкции:
> dput(insulin)
structure(list(DM = c("Type 2", "Type 2", "Type 2", "Type 2",
"Type 2", "Type 2", "Type 2", "Type 2", "Type 2", "Type 2", "Type 2",
"Type 2", "Type 2", "Type 2", "Type 1", "Type 1", "Type 1", "Type 1",
"Type 1", "Type 1", "Type 1", "Type 1", "Type 1", "Type 1", "Type 1",
"Type 1", "Type 1", "Type 1", "Type 2", "Type 2", "Type 2", "Type 2",
"Type 2", "Type 2", "Type 2", "Type 2", "Type 1", "Type 1", "Type 1",
"Type 1", "Type 1", "Type 1", "Type 1", "Type 1", "Type 2", "Type 2",
"Type 2", "Type 2", "Type 2", "Type 2", "Type 2", "Type 2", "Type 2",
"Type 2", "Type 1", "Type 1", "Type 1", "Type 1", "Type 1", "Type 1",
"Type 1", "Type 1", "Type 1", "Type 1"), Time = c("AM", "AM",
"AM", "AM", "AM", "AM", "AM", "PM", "PM", "PM", "PM", "PM", "PM",
"PM", "AM", "AM", "AM", "AM", "AM", "AM", "AM", "PM", "PM", "PM",
"PM", "PM", "PM", "PM", "AM", "AM", "AM", "AM", "PM", "PM", "PM",
"PM", "AM", "AM", "AM", "AM", "PM", "PM", "PM", "PM", "AM", "AM",
"AM", "AM", "AM", "PM", "PM", "PM", "PM", "PM", "AM", "AM", "AM",
"AM", "AM", "PM", "PM", "PM", "PM", "PM"), Class = c("Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Long and Intermediate acting",
"Long and Intermediate acting", "Pre-Mixed", "Pre-Mixed", "Pre-Mixed",
"Pre-Mixed", "Pre-Mixed", "Pre-Mixed", "Pre-Mixed", "Pre-Mixed",
"Pre-Mixed", "Pre-Mixed", "Pre-Mixed", "Pre-Mixed", "Pre-Mixed",
"Pre-Mixed", "Pre-Mixed", "Pre-Mixed", "Rapid or Short acting",
"Rapid or Short acting", "Rapid or Short acting", "Rapid or Short acting",
"Rapid or Short acting", "Rapid or Short acting", "Rapid or Short acting",
"Rapid or Short acting", "Rapid or Short acting", "Rapid or Short acting",
"Rapid or Short acting", "Rapid or Short acting", "Rapid or Short acting",
"Rapid or Short acting", "Rapid or Short acting", "Rapid or Short acting",
"Rapid or Short acting", "Rapid or Short acting", "Rapid or Short acting",
"Rapid or Short acting"), Name = c("Abasaglar", "Lantus", "Levemir",
"Toujeo", "Tresiba", "Insulatard", "Humulin I", "Abasaglar",
"Lantus", "Levemir", "Toujeo", "Tresiba", "Insulatard", "Humulin I",
"Abasaglar", "Lantus", "Levemir", "Toujeo", "Tresiba", "Insulatard",
"Humulin I", "Abasaglar", "Lantus", "Levemir", "Toujeo", "Tresiba",
"Insulatard", "Humulin I", "Humulin M3", "Novomix 30", "Insuman Comb 15/25/50",
"Humalog Mix 25/50", "Humulin M3", "Novomix 30", "Insuman Comb 15/25/50",
"Humalog Mix 25/50", "Humulin M3", "Novomix 30", "Insuman Comb 15/25/50",
"Humalog Mix 25/50", "Humulin M3", "Novomix 30", "Insuman Comb 15/25/50",
"Humalog Mix 25/50", "Novorapid/Fiasp", "Humalog", "Apidra",
"Humulin S", "Actrapid", "Novorapid/Fiasp", "Humalog", "Apidra",
"Humulin S", "Actrapid", "Novorapid/Fiasp", "Humalog", "Apidra",
"Humulin S", "Actrapid", "Novorapid/Fiasp", "Humalog", "Apidra",
"Humulin S", "Actrapid"), Plan = c("Usual dose at usual time",
"Usual dose at usual time", "Usual dose at usual time", "Usual dose at usual time",
"Usual dose at usual time", "Usual dose at usual time", "Usual dose at usual time",
"Usual dose at usual time", "Usual dose at usual time", "Usual dose at usual time",
"Usual dose at usual time", "Usual dose at usual time", "Usual dose at usual time",
"Usual dose at usual time", "Usual dose at usual time", "Usual dose at usual time",
"Usual dose at usual time", "Usual dose at usual time", "Usual dose at usual time",
"Usual dose at usual time", "Usual dose at usual time", "Usual dose at usual time",
"Usual dose at usual time", "Usual dose at usual time", "Usual dose at usual time",
"Usual dose at usual time", "Usual dose at usual time", "Usual dose at usual time",
"Half usual morning dose taken with a sugary drink at 7am", "Half usual morning dose taken with a sugary drink at 7am",
"Half usual morning dose taken with a sugary drink at 7am", "Half usual morning dose taken with a sugary drink at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a sugary drink at 7am", "Half usual morning dose taken with a sugary drink at 7am",
"Half usual morning dose taken with a sugary drink at 7am", "Half usual morning dose taken with a sugary drink at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Omit breakfast dose", "Omit breakfast dose", "Omit breakfast dose",
"Omit breakfast dose", "Omit breakfast dose", "Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Half usual morning dose taken with a light breakfast at 7am",
"Omit breakfast dose", "Omit breakfast dose", "Omit breakfast dose",
"Omit breakfast dose", "Omit breakfast dose", "Usual morning dose taken with a light breakfast at 7am, oral fluids until 11am, omit lunchtime dose",
"Usual morning dose taken with a light breakfast at 7am, oral fluids until 11am, omit lunchtime dose",
"Usual morning dose taken with a light breakfast at 7am, oral fluids until 11am, omit lunchtime dose",
"Usual morning dose taken with a light breakfast at 7am, oral fluids until 11am, omit lunchtime dose",
"Usual morning dose taken with a light breakfast at 7am, oral fluids until 11am, omit lunchtime dose"
)), row.names = c(NA, -64L), class = c("tbl_df", "tbl", "data.frame"
))
Я попробовал метод, описанный здесь. Я вставил код из ссылки напрямую, но, похоже, ничего не получается со следующей ошибкой:
Warning in normalizePath(path.expand(path), winslash, mustWork) :
path[1]="report.Rmd": The system cannot find the file specified
Warning in normalizePath(path.expand(path), winslash, mustWork) :
path[1]="report.Rmd": The system cannot find the file specified
Warning: Error in abs_path: The file 'report.Rmd' does not exist.
[No stack trace available]
На данный момент, даже если бы я мог просто экспортировать DT в pdf, было бы полезно.
Изменить: для запроса об отображении выходного объекта. Код на стороне сервера:
my_ortho_table <- reactive({
ortho_table <- drugsUI %>%
filter(Ortho == "yes") %>%
select(Name, Recommendations)
return(ortho_table)
})
observeEvent(input$ortho, {
if(input$ortho == "yes"){
output$ortho_tab <- renderTable({
xtable(my_ortho_table())})
output$ortho_text <- renderText("Additional information for patients undergoing hip and knee replacement or revision,
if taking the following medications")
}else{
output$ortho_tab <- NULL
output$ortho_text <- NULL
}
На стороне пользовательского интерфейса:
textOutput("ortho_text"),
tableOutput("ortho_tab"),
Это ortho_text
, который я хотел бы отобразить (или нет, в зависимости от ввода) в формате PDF.
Дальнейшее редактирование: это то, что я пробовал
my_ortho_table <- reactive({
ortho_table <- drugsUI %>%
filter(Ortho == "yes") %>%
select(Name, Recommendations)
if(input$ortho == "yes"){
output$ortho_tab <- renderTable({
xtable(ortho_table)})
}else{
output$ortho_tab <- NULL
}
})
my_ortho_text <- reactive({
if(input$ortho == "yes"){
output$ortho_text <- renderText("Additional information for patients undergoing hip and knee replacement or revision,
if taking the following medications")
}else{
output$ortho_text <- NULL
}
})
с соответствующим выводом:
output$ortho_table <- my_ortho_table()
output$ortho_text <- my_ortho_text()
но получил следующую ошибку:
Error in .getReactiveEnvironment()$currentContext() :
Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)
report.Rmd
для использования в RMarkdown, который включает макет того, что вы хотите в отчете? Если нет, вы получите эту ошибку. Это пример отчета, использованный в примере Shiny, на который вы ссылались: github.com/rstudio/shiny-examples/blob/master/016-knitr-pdf/ Если вам нужна дополнительная помощь, дайте мне знать. - person Ben   schedule 17.11.2019