#javascript #r #shiny
#javascript #r #блестящий
Вопрос:
Я хочу использовать приложение R shiny с js SDK одной социальной сети. Я хочу получить идентификатор пользователя из js API и установить его в качестве значения по умолчанию для формы ввода текста. Но только один раз, в первый раз.
Наилучшего результата мне удалось добиться с помощью Shiny.onInputChange()
функции (или Shiny.setInputValue()
для shiny>1.1)
Игрушечный пример:
ui <- fluidPage(
textInput("uid",label = h4("Input ID"),value = "1"),
actionButton("goButton", "Check this out!", class="btn-primary"),
# getting user id via js
tags$script(HTML(
'
uid = some_js_code;
console.log("My uid - " uid);
// setting new value for input$uid variable
Shiny.onInputChange("uid", uid);
// for newer version of shiny
//Shiny.setInputValue("uid", uid);
'
)
server <- function(input, output, session) {
user<-reactive({
input$goButton
user <- some_function_for_uid(input$uid)
})
}
Проблемы:
-
При первой загрузке приложения значение переменной «uid» не меняется. Значение остается таким, каким оно было в функции TextInput (
value="1"
) -
Серверная функция
some_function_for_uid()
получает новое значение переменной только при нажатии кнопки goButton. Но значение в текстовой форме остается неизменным.
Как правильно изменить значение по умолчанию в TextInput и избежать описанных проблем? Заранее благодарю вас.
Ответ №1:
Чтобы обновить значение в textInput
:
$("#uid").val(uid);
Я не знаю, что вы хотите сделать с кнопкой. Это нормально, как это:
ui <- fluidPage(
textInput("uid", label = h4("Input ID"), value = "1"),
verbatimTextOutput("showUID"),
#actionButton("goButton", "Check this out!", class="btn-primary"),
tags$script(HTML(
'
uid = "hello";
// setting new value in the textInput
$("#uid").val(uid);
// setting new value for input$uid variable
Shiny.onInputChange("uid", uid);
'
))
)
server <- function(input, output, session) {
user <- eventReactive(input$uid, {
rep(input$uid, 3)
})
output[["showUID"]] <- renderText({user()})
}
Комментарии:
1. Спасибо! Это
$("#uid").val(uid);
частично помогает. Но я хочу использовать кнопку для отправки данных. Реактивное поведение неудобно, когда вычисления занимают много времени.2. Почти хорошо 🙂 Но я хочу видеть результат для первого (по умолчанию) значения без нажатия кнопки при запуске приложения.
3. @Yuriy Mmhh не уверен, но я бы попробовал этот вариант
ignoreNULL=FALSE
, например :eventReactive(input$goButton, {......}, ignoreNULL = FALSE)
.4.
ignoreNULL = FALSE
работает, и результат можно увидеть при запуске приложения. Но проблема в том, что в этом случае переменнаяuid
не переназначается js и берется из формы ввода default (value=1
) . Такое же странное поведение я вижу и в своем коде. На самом деле это основная проблема во всем этом случае.