作者skylikewater (choc.)
看板R_Language
标题[问题] 用 Shiny 做资料库表单
时间Fri Mar 20 13:16:22 2015
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
使用者(已经有用R 做过不少作品)
[问题叙述]:
我在自己的 Shiny server 上写一个能读 MySQL 资料的网页
现在想在其中一个 tab 加入操作资料库的功能。
例如说,我可以选择 table 中的某一列,
然後下面各个变数就会用预设值的形式叫出那笔资料,
我可以直接更改、然後送出修订。
目前我的 UI 是:
output$KeyIn = renderUI({
fluidPage(
numericInput("RowChoice", "选择第几笔资料", value = 1,
min = 1, max = dim(Data)[1], step = 1),
h2("以下是编辑区")
fluidRow(
column(width = 3,
textInput("Var", "变数",
value = Data$Var[input$RowChoice]))
),
fluidRow(
column(width = 12, offset = 6,
submitButton("送出修订"))
)
)
})
Data$Var[isolate(input$RowChoice)]
isolate(Data$Var[input$RowChoice]) 都不合法
我试过另外写一个 reactive:
VarReac = reactive({as.numeric(input$RowChoice)})
或是用一个 function:
VarFunc = function(input) { return(input$RowChoice) }
然後用 VarFunc() 呼叫都不行。
我希望这个网站可以尽可能地用 R 来完成,
所以想徵询大家,可以怎麽在 R 实现这件事
傍晚补充 =>
我写出一个合法的版本了但我看不太懂:
textInput("Var", "变数",
value = reactive(function() {
if (is.null(input$RowChoice)) {
return("NULL")
} else {
return(isolate({
Data$Var[input$RowChoice])
}))
}
})())
我不太懂为什麽 reactive 一定要内含一个 function、再去 no input "()"
而且为什麽一定要考虑 is.null 的状况?
我直接把 isolate({Data$Var[input$RowChoice]}) 写在 value = 之後却又不行?
[程式范例]:
如上
[环境叙述]:
R version 3.1.2 (2014-10-31)
Platform: x86_64-redhat-linux-gnu (64-bit)
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] RMySQL_0.10.2 DBI_0.3.1 shiny_0.11.1
[关键字]:
Shiny, form, reactive value
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.121.113
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1426828595.A.49B.html
※ 编辑: skylikewater (140.112.121.113), 03/20/2015 16:37:26
※ 编辑: skylikewater (140.112.121.113), 03/20/2015 16:37:34
1F:→ skylikewater: reactive(function() { 需要简化为 reactive({ 03/22 19:56
2F:→ skylikewater: 不然会有 "Passing functions to 'reactive' is 03/22 19:59
3F:→ skylikewater: deprecated" 的警告 03/22 19:59
4F:→ skylikewater: 而一个 renderUI 中至少要有一个 03/22 19:59
5F:→ skylikewater: if (is.null(input$XXX)) 判断式,不然不会动 03/22 20:00
6F:→ skylikewater: 但也不会报错 真的很诡异的 bug 03/22 20:00