Установка значения ввода текста по умолчанию в R shiny через js (как результат функции js)

#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)

  })

}
  

Проблемы:

  1. При первой загрузке приложения значение переменной «uid» не меняется. Значение остается таким, каким оно было в функции TextInput ( value="1" )

  2. Серверная функция 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 ) . Такое же странное поведение я вижу и в своем коде. На самом деле это основная проблема во всем этом случае.