Shiny - 为什么Shiny不会对评估/解析表达式的结果做出反应?

时间:2015-07-21 04:29:53

标签: r scope shiny

有关某些功能和背景,请参阅this question

Here's an overview of the app. Some of the console output and debugging output is shown here.

守则

现在,我正试图“治愈”这个服务器代码:

env = module_env$normalization

eval(envir= module_env$normalization, {

jjjj <- reactive({
  eval(parse(text=paste(sep='', "input$", mod_id('var_echo'))))
})

####
#### vvvvvvvvvvvvvvvvvvvv
####
observeEvent(jjjj, {
# observeEvent(evalq(parse(text=paste(sep='', 'input$', mod_id('var_echo', env)))), {
  print("HEY")
  print(get('sum_exp', env))
})
####
#### ^^^^^^^^^^^^^^^^^^^^^^
####

observeEvent(input$print_mod_id, {
  browser()

  print(mod_id('var_echo', env))
  print(paste("input$", mod_id('var_echo', env), sep=''))
  print(parse(text=paste(sep='', "input$", mod_id('var_echo', env))))
  print(eval(parse(text=paste(sep='', "input$", mod_id('var_echo', env)))))
})

})

意图与此UI代码配对:

module_env$normalization <- new.env()
env = module_env$normalization

evalq(envir = env, {
  #Create the UI here
  ui_normalization <-
  tabsetPanel(
    tabPanel('Normalization (FPKM)',
      p("normalization"),
      actionButton(inputId = mod_id('var_echo', env), "Echo variables"),
      actionButton("print_mod_id", "Print module UI")
    )
  )

  print(mod_id('var_echo', env))

  #Create your initial input/output variables here
  sum_exp <- NULL
  output_sum_exp <- NULL

  #Always register last
  register_module(
    name="Normalization (FPKM)",
    module=ui_normalization,
    env=env,
    inputs=c('sum_exp'),
    outputs=c('output_sum_exp')
  )
})

这两个文件将在应用程序的不同时间被调用,但最终将使用source("FILENAME.R", local=TRUE)调用源文件的环境本地化到全局环境,该环境也保存应用程序。

问题

大部分用于调试,但最重要的是Shiny正在读取表达式jjjj(应用确实运行),但是按下按钮时没有反应。

mod_id()是一个特殊的函数,用于响应调用它的环境,根据字符串及其调用环境生成特殊键:

###Sample results for the print_mod_id print statements

[1] "id0x000000001e9047f0__var_echo"
[1] "input$id0x000000001e9047f0__var_echo"
expression(input$id0x000000001e9047f0__var_echo)
[1] 2
attr(,"class")
[1] "integer"                "shinyActionButtonValue"

这是mod_id(string, environment),它返回一个字符串:

mod_id <- function(name, envir = NULL) {
  if(identical(envir, globalenv())) {
    e = envir
  } else if (is.null(envir)) {
    e = parent.frame()
  } else if (is.environment(envir)) {
    e = envir
  } else {
    stop("given non-default argument \'envir\' is not an environment")
  }
  return(paste(sep = "",
    "id",
    sub('<environment: (.*)>', '\\1', capture.output(e)),
    "__",
    name
    )
  )
}

测试观察

以下是我所做的一些测试:

  1. mod_id()为UI和服务器生成的唯一ID确实相同。我已经进去并修复了任何差异,所以他们确实匹配。
  2. 用于获取最终input$INPUT_ID_FOR_SHINY名称的表达式适用于另一种情况,除非变量名称被函数mod_id()替换。我不确定为什么,但它可能与由总体eval声明引起的评估顺序有关。
  3. jjjj触发的事件在应用开始时触发一次。我不知道为什么会这样,但事实是它确实发生了。
  4. 编辑:其他测试,现在我的机器上有Shiny源代码。表达式现在是:evalq(as.name(paste(sep='', 'input$', mod_id('var_echo', env))))但它仍然不起作用。

0 个答案:

没有答案