Shiny R: обновление textInput, когда шаблон соответствует заданному символу вектора во фрейме данных - PullRequest
1 голос
/ 21 марта 2019

Моя проблема в том, что у меня есть заданный фрейм данных, и мне нужно искать разные шаблоны.Когда шаблон соответствует заданному символьному вектору, содержимое той же строки, но другого столбца должно обновлять textInput.

В качестве примера я создал небольшое блестящее приложение, потому что мой исходный код слишком велик.Пример работает, но я использую циклы и не хочу этого делать.Кто-нибудь знает лучшее решение?Есть ли решение с векторизованной функцией?Я действительно был бы признателен, если бы кто-нибудь знал решение dplyr.

Пример:

library(shiny)

ui <- fluidPage(
textInput(inputId="wave1", label="wavelength"),
textInput(inputId="wave2", label="wavelength")
)

server <- name <- function(input,output,session) {

df <- data.frame("color" = c("red","blue","green"), "wavelength" = c("700 nm","460 nm","520 nm"))

for (i in 1:nrow(df)) {
if(grepl("lue",df$color[i],fixed=TRUE) == TRUE){updateTextInput(session, inputId="wave1", label = NULL, value = df$wavelength[i],placeholder = NULL)}
}

for (i in 1:nrow(df)) {
if(grepl("ee",df$color[i],fixed=TRUE) == TRUE){updateTextInput(session, inputId="wave2", label = NULL, value = df$wavelength[i],placeholder = NULL)}
}
}

shinyApp(ui = ui, server = server)

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

1 Ответ

1 голос
/ 21 марта 2019

Вместо зацикливания вы можете индексировать данные непосредственно из результата grep:

server <- name <- function(input,output,session) {

    df <- data.frame("color" = c("red","blue","green"), "wavelength" = c("700 nm","460 nm","520 nm"))

    updateTextInput(session, inputId="wave1", label = NULL,
                    value = df$wavelength[grep("lue", df$color, fixed=TRUE)],
                    placeholder = NULL)
    updateTextInput(session, inputId="wave2", label = NULL,
                    value = df$wavelength[grep("ee", df$color, fixed=TRUE)],
                    placeholder = NULL)
}

И один из способов сделать это с помощью dplyr:

server <- name <- function(input,output,session) {

    df <- data.frame("color" = c("red","blue","green"), "wavelength" = c("700 nm","460 nm","520 nm"))

    updateTextInput(session, inputId="wave1", label = NULL,
                    value = dplyr::filter(df, grepl("lue", color, fixed=TRUE)) %>% dplyr::pull(wavelength),
                    placeholder = NULL)
    updateTextInput(session, inputId="wave2", label = NULL,
                    value = dplyr::filter(df, grepl("ee", color, fixed=TRUE)) %>% dplyr::pull(wavelength),
                    placeholder = NULL)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...