Shiny: 使用 shinyjs 获取 cookie 数据
Shiny: use shinyjs to fetch cookie data
我想使用 shinyjs 从我的 Shiny 应用中获取 cookie 数据。我创建了一个 cookie,"samplecookie=testval";我希望能够检索 samplecookie 的值。我使用下面的 javascript 函数(我在其中传递 cookieName 并将其 returns 相应的值)。
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";
下面是 shiny 应用程序中的 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 值。有人可以帮助我了解我做错了什么吗?感谢任何帮助。谢谢
我是 shinyjs 的作者。您不能像那样使用它来将值从 JS 传递到 R。将值从 JS 传递到 R 的唯一方法是使用输入。在 JavaScript 中,您必须调用 Shiny.onInputChange()
函数,而在 R 中,您需要添加一个 observe/reactive 语句来侦听正在更改的输入。
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)
我想使用 shinyjs 从我的 Shiny 应用中获取 cookie 数据。我创建了一个 cookie,"samplecookie=testval";我希望能够检索 samplecookie 的值。我使用下面的 javascript 函数(我在其中传递 cookieName 并将其 returns 相应的值)。
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";
下面是 shiny 应用程序中的 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 值。有人可以帮助我了解我做错了什么吗?感谢任何帮助。谢谢
我是 shinyjs 的作者。您不能像那样使用它来将值从 JS 传递到 R。将值从 JS 传递到 R 的唯一方法是使用输入。在 JavaScript 中,您必须调用 Shiny.onInputChange()
函数,而在 R 中,您需要添加一个 observe/reactive 语句来侦听正在更改的输入。
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)