2016-01-11 5 views
6

Я хочу получать данные cookie из моего приложения Shiny, используя shinyjs. Я создал cookie, «samplecookie = testval»; и я хочу, чтобы получить значение samplecookie. Я использую нижеследующую функцию javascript (где я передаю cookieName и возвращает соответствующее значение).Блестящие: используйте shinyjs для получения данных cookie

function fetchCookie(name) { 
var nameEQ = name + "="; 
var ca = document.cookie.split(";"); 
for(var i=0;i < ca.length;i++) { 
var c = ca[i]; 
while (c.charAt(0)==" ") c = c.substring(1,c.length); 
if (c.indexOf(nameEQ) == 0) return  c.substring(nameEQ.length,c.length); 
} 
return "No such cookie"; 

Ниже Javascript код в блестящем приложении

jsCode<-'shinyjs.tstfunc= 
    function (name) { 
var nameEQ = name + "="; 
var ca = document.cookie.split(";"); 
for(var i=0;i < ca.length;i++) { 
var c = ca[i]; 
while (c.charAt(0)==" ") c = c.substring(1,c.length); 
if (c.indexOf(nameEQ) == 0) return  c.substring(nameEQ.length,c.length); 
return "No such cookie"; 
} 
}' 

ui <- shinyUI(fluidPage(mainPanel(
    useShinyjs(), 
    extendShinyjs(text = jsCode) 
))) 

server <- function(input, output) 
    { 
    observe({ 
    x=js$tstfunc("samplecookie") 
    print(x) 
    }) 
    } 

shinyApp(ui=ui, server=server) 

Я ожидаю, что когда я прохожу «samplecookie» в качестве параметра функции tstfunc(), он должен напечатать «testval» на консоль. Но каждый раз, когда я получаю возвращаемое значение NULL. Может кто-нибудь помочь мне понять, что я делаю неправильно? Цените любую помощь. Благодарю.

ответ

10

Я автор shinyjs. Вы не можете использовать его так, чтобы передавать значения из JS в R. Единственный способ передать значение из JS в R - использовать входы. В JavaScript вам нужно будет вызвать функцию Shiny.onInputChange(), а в R вам нужно добавить наблюдательный/реактивный оператор, который прослушивает измененный вход.

Read this page to learn about passing values from JS to R

код вы предоставляете немного странно и трудно читать, так вот простой пример того, как это сделать. Этот код просто просит JavaScript передать текущее время R, это просто, но он показывает, как это сделать.

library(shiny) 
library(shinyjs) 

jsCode <- 'shinyjs.gettime = function(params) { 
    var time = Date(); 
    Shiny.onInputChange("jstime", time); 
}' 

ui <- fluidPage(
    useShinyjs(), 
    extendShinyjs(text = jsCode, functions = "gettime") 
) 

server <- function(input, output) { 
    js$gettime() 

    observe({ 
    cat(input$jstime) 
    }) 
} 

shinyApp(ui = ui, server = server) 
+0

Получил его. Это работает. Благодаря @daattali – rookieJoe

Смежные вопросы