Shiny: 使用shinyjs获取cookie数据

7
我想使用shinyjs从我的Shiny应用程序中获取cookie数据。我已经创建了一个名为"samplecookie=testval"的cookie,并且我希望能够检索samplecookie的值。我使用下面的javascript函数(其中我传递cookieName,它返回相应的值)。
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值返回。有没有人能帮我理解我做错了什么?非常感谢任何帮助。谢谢。

1个回答

18

我是shinyjs的作者。你不能像那样使用它来将值从JS传递给R。从JS到R传递值的唯一方法是使用inputs。在JavaScript中,您需要调用Shiny.onInputChange()函数,在R中,您需要添加一个观察/反应语句来监听该输入被更改。

阅读此页面以了解有关从JS传递值到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)

1
@daattali 有没有计划扩展 shinyjs 以支持以随意方式返回参数?这确实非常方便。 - AdamB
@AdamB,你的意思是通过JavaScript返回值给shiny吗?如果是这样,那是不可能的,我也看不出来它怎么可能会成为可能(也许我错了,但我认为不支持这种交互)。 - DeanAttali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接