Вопрос или проблема
Я создал приложение предсказания текста, которое отображает 10 предложений на основе слова, введенного в строку поиска. Однако все предложения отображаются в одной строке поиска горизонтально. Я хотел бы, чтобы предложения появлялись последовательно, то есть вертикально, одно за другим.
ui<- shinyUI(fluidPage(
# Заголовок приложения
mainPanel(
img(src="https://datascience.stackexchange.com/questions/76907/image.jpg", align = "right"),
#titlePanel(title=div(img(src="spsimage.jpg"))),
fluidRow(HTML("<strong> Строка поиска")),
#fluidRow(HTML(" <strong>Дата: 06-29-2020</strong>") ),
fluidRow(
br(),
p("Приложение предсказания текста ")),
br(),
br(),
fluidRow(HTML("<strong>Введите слово. Нажмите кнопку \"Следующие слова\", чтобы предсказать следующие слова</strong>") ),
fluidRow( p("\n") ),
# Оформление боковой панели
sidebarLayout(
sidebarPanel(
textInput("inputString", "Введите слово здесь",value = " "),
submitButton("Следующие слова")
),
mainPanel(
h4("Предсказанное следующее слово"),
verbatimTextOutput("prediction"),
textOutput('text1'),
)
)
)))
server <- function(input, output, session) {
sentences <- reactive({
make_sentences(input$inputString)
})
output$prediction <- renderText({ sentences() })
}
вывод получается как – Злой взгляд на некоторое время на злой взгляд, и герцог Ангиенский Злой взгляд был тоном или Ангри слезы. “Лиза!” Это было? Злой слезы. “Лиза!” Сказала принцесса Анна Злой взгляд так же сильно, как она Злой взгляд на троих из Злой слезы. “Лиза!” Сказал на злой взгляд, зафиксированный на Злом взгляде, и фейерверков нет
Я предпочел бы -
1- Злой взгляд на некоторое время на
2- Злой взгляд, и герцог Ангиенский
3- Злой взгляд был тоном или злой слезы. "Лиза!" Это было?
4-Злой слезы. "Лиза!" Сказала принцесса Анна
5-Злой взгляд так же сильно, как она
'''''
Может быть, вы могли бы поместить предложения в фрейм данных и использовать renderTable
, что-то вроде этого:
server <- function(input, output, session) {
sentences <- reactive({
data.frame(sentences=make_sentences(input$inputString))
})
output$prediction <- renderTable(sentences())
}
[редактировать]
Для того, чтобы они были только строчными, что-то вроде этого может сработать:
server <- function(input, output, session) {
sentences <- reactive({
paste(make_sentences(input$inputString),sep='<br/>')
})
output$prediction <- renderTable(sentences())
}
Кроме того, вы могли бы создать нумерованный список, используя соответствующие HTML-теги: вставьте весь список внутрь <ol> ... </ol>
и каждое предложение в <li> .. </li>
.
Сработало для меня с некоторыми изменениями
ui <- fluidpage(
tags$style("#mytext {white-space: pre-line;}"),
verbatimTextOutput("mytext")
server <- function(input, output, session) {
output$mytext <- renderPrint({
sentences <- rep(make_sentences(input$inputString))
length(sentences)
cat(paste0(1:length(sentences)," ",sentences,sep= '\n'))
})
}
Ответ или решение
Создание приложения на основе Shiny для прогноза текста и его правильного отображения с использованием Reactivity является сложной задачей, требующей как тщательной настройки интерфейса, так и работы с серверной частью приложения. В данном случае вам необходимо обеспечить правильное отображение предложений в виде вертикального списка, чтобы улучшить пользовательский интерфейс и восприятие информации.
Теория: Проблема и ее структура
Задача: Основная проблема заключается в том, что предложения, получаемые в результате прогноза, отображаются линейно, т.е. в одной строке, что усложняет их восприятие. Чтобы улучшить восприятие, необходимо разбить этот текст на отдельные строки или отобразить его в виде списка.
Детализация проблемы
- Формат отображения: Вместо вывода текста в единой строке требуется отображение данных в виде вертикального списка.
- Технические ограничения: Неправильное использование функций вывода, таких как
verbatimTextOutput
, может приводить к объединению текста в одну строку. Таким образом, использование функцийrenderTable
илиrenderPrint
с пошаговым разделением текста может помочь решить проблему. - Учет UX/UI: Улучшение интерфейса за счет правильного построения списка предложений придаст приложению более систематизированный и интеллектуальный вид, улучшая общее восприятие.
Пример: Настройка серверной части с примером кода
Работа с сервером
Ваша задача заключается в корректной настройке серверной логики Shiny, чтобы преобразовать выходные данные в вертикальный список.
server <- function(input, output, session) {
# Функция для генерации предложений на основе введенного слова
sentences <- reactive({
# Предполагается существование функции make_sentences(), которая возвращает вектор строк
make_sentences(input$inputString)
})
# Вывод в табличной форме для вертикального отображения
output$prediction <- renderTable({
data.frame(Index = 1:length(sentences()), Sentences = sentences())
})
}
Улучшенный вариант с использованием HTML
Иногда простая табличная форма может не быть столь визуально привлекательной. Вы можете использовать HTML-теги для отображения нумерованного списка:
server <- function(input, output, session) {
sentences <- reactive({
# Возвращает вектор строк
make_sentences(input$inputString)
})
# Используем renderUI для вывода с HTML тэгами
output$prediction <- renderUI({
HTML(paste0("<ol>",
paste("<li>", sentences(), "</li>", collapse = ""),
"</ol>"))
})
}
Применение: Как интегрировать решение
Изменение интерфейса
Используйте UI
-функции, такие как uiOutput
или htmlOutput
, для вывода отформатированного текста, что позволит более гибко манипулировать HTML и CSS при создании пользовательского интерфейса.
ui <- fluidPage(
titlePanel("Text Prediction"),
sidebarLayout(
sidebarPanel(
textInput("inputString", "Введите слово здесь", value = ""),
actionButton("predictBtn", "Next words")
),
mainPanel(
h4("Предсказанные предложения"),
uiOutput("prediction") # Используем для вывода HTML-контента
)
)
)
Подключение пользовательских стилей
Вы также можете настроить CSS для улучшения внешнего вида. Так, путем добавления пользовательских стилей можно управлять отображением, вводя необходимый отступ, цвет или шрифт, что также может быть полезным для повышения юзабилити:
tags$head(
tags$style(HTML("
#prediction li {
margin: 5px 0;
}
"))
)
Подводя итог, важно подчеркнуть, что для успешной интеграции решения необходимо обеспечивать адаптивность и гибкость настроек выводимой информации, учитывая возможности Shiny по взаимодействию с HTML/CSS и использование реактивных элементов. Такой подход позволяет не только решать конкретные задачи отображения, но и обеспечивает масштабируемость вашего приложения.