有关某些功能和背景,请参阅this question。
现在,我正试图“治愈”这个服务器代码:
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
)
)
}
以下是我所做的一些测试:
mod_id()
为UI和服务器生成的唯一ID确实相同。我已经进去并修复了任何差异,所以他们确实匹配。input$INPUT_ID_FOR_SHINY
名称的表达式适用于另一种情况,除非变量名称被函数mod_id()
替换。我不确定为什么,但它可能与由总体eval
声明引起的评估顺序有关。jjjj
触发的事件在应用开始时触发一次。我不知道为什么会这样,但事实是它确实发生了。 编辑:其他测试,现在我的机器上有Shiny源代码。表达式现在是:evalq(as.name(paste(sep='', 'input$', mod_id('var_echo', env))))
但它仍然不起作用。