闪亮的反应式下拉菜单行为不端(带有数字输入)
Shiny reactive dropdown misbehaving (with number inputs)
这是一个摘要块的模型,它显示了在别处绘制的值的前 10 位或后 10 位。
问题
更改变量名称或排序方向工作正常,但更改要显示多少数据的限制 (limit1
) 最初显示 10,但将其更改为小于 5 最终显示所有数据。更改为更高的值有时会起作用,但并非总是如此。很奇怪!
很好
不行
代码
library(shiny)
library(data.table)
dataset1 <- as.data.table(iris)
server <- function(input, output) {
# Top table
datatop1 <- reactive({
dt <- copy(dataset1)
setorderv(dt,input$t1, input$sort1) # -1 is descending
# choose subset of rows
row.limit <- min(nrow(dataset1), input$limit1)
dt <- dt[1:row.limit, ]
# choose columns
dt <- dt[, .(Species, get(input$t1))]
setnames(dt,"V2",input$t1)
return(dt)
})
output$top1 <- renderUI({
if(!is.null(dataset1)) {
fluidRow(inputPanel(
selectInput("limit1", "Limit:",
c("5", "10", "15", "20", "25", "50"),
selected = "10"),
selectInput(("t1"), "Variable:", choices = names(dataset1),
selected = "Sepal.Length"),
selectInput("sort1", "Sort by:",
choices = c('Bottom / Asc.' = +1 , 'Top / Desc.' = -1),
selected = -1)
))
}
})
# Top panel
output$screenTop1 <- renderTable({
# top dataset is in reactive as function
datatop1()
})
output$screenTop <- renderUI({
tagList(
uiOutput("top1"),
uiOutput("screenTop1")
)
})
}
ui <- shinyUI(
fluidPage(tabPanel("Top", uiOutput("screenTop"))
)
)
shinyApp(ui=ui, server = server)
data.table
的子集化有问题吗?或者我使用反应的方式?闪亮的专家-我将不胜感激指导我做错了什么,以及为什么我还没有完全掌握反应性。抱歉,代码有点复杂,因为主要代码位于不同的文件结构中。
> sessionInfo()
R version 3.2.4 Revised (2016-03-16 r70336)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.9.6 shiny_0.13.2
编辑:解释
@Pork Chop 在下面的精彩评论中解释说 min
最终可能会强迫所有角色。因此,当面对 226 和“5”时,它变成了对“226”和“5”的测试,并且在逐个元素的基础上,“2”击败了“5”,因此选择“226”作为最小值,并显示所有行。
但是对于 10 和 20,它不是例如“226”和“10”第一位数字1<2。并显示了正确的最小值。 课程:观察类型并确保在需要时将 SelectInput input$vars 设置为 as.numeric
。
解谜!
你可以试试这个:
# choose subset of rows
#row.limit <- min(nrow(dataset1), input$limit1)
dt <- dt[1:input$limit1, ]
没有必要 "calculate" row.limit
。作为一个数字,您可以直接包含它。就像 dt[1:5, ]
更新您的子集:
row.limit <- min(nrow(dataset1), as.numeric(input$limit1))
编辑:
1) 由于 min
需要一个 numeric
变量来正确计算 min
您需要 cast
来更正数据类型:as.numeric(input$limit1)
,否则它将采用其他数字变量
2) 默认情况下 selectinput
是 string
类型,因为 selectInput()
和 selectizeInput()
使用 JavaScript
库 selectize.js
3) 如果你阅读 selectize documentation 你会发现 "Selectize is instantiated from a <input type="text"> element"
在您的开发中,我建议您尽可能多地使用 validate
和 need
,您可以找到一些文档 here。也尽量使用 print
为了说明需要最少的字符串:
如果您键入 ?min
,您会发现对于字符串的计算如下:
- 如果集合中存在 一个 字符串,它将强制整个集合键入
character
- 当取
min
时,字符串的排序是使用Lexicographical order完成的,意思是字母顺序,这意味着如果你取min(c("10",2))
,它将return "10"
as 1
comes before 2
once 2
is coerced
into the string
这是一个摘要块的模型,它显示了在别处绘制的值的前 10 位或后 10 位。
问题
更改变量名称或排序方向工作正常,但更改要显示多少数据的限制 (limit1
) 最初显示 10,但将其更改为小于 5 最终显示所有数据。更改为更高的值有时会起作用,但并非总是如此。很奇怪!
很好
不行
代码
library(shiny)
library(data.table)
dataset1 <- as.data.table(iris)
server <- function(input, output) {
# Top table
datatop1 <- reactive({
dt <- copy(dataset1)
setorderv(dt,input$t1, input$sort1) # -1 is descending
# choose subset of rows
row.limit <- min(nrow(dataset1), input$limit1)
dt <- dt[1:row.limit, ]
# choose columns
dt <- dt[, .(Species, get(input$t1))]
setnames(dt,"V2",input$t1)
return(dt)
})
output$top1 <- renderUI({
if(!is.null(dataset1)) {
fluidRow(inputPanel(
selectInput("limit1", "Limit:",
c("5", "10", "15", "20", "25", "50"),
selected = "10"),
selectInput(("t1"), "Variable:", choices = names(dataset1),
selected = "Sepal.Length"),
selectInput("sort1", "Sort by:",
choices = c('Bottom / Asc.' = +1 , 'Top / Desc.' = -1),
selected = -1)
))
}
})
# Top panel
output$screenTop1 <- renderTable({
# top dataset is in reactive as function
datatop1()
})
output$screenTop <- renderUI({
tagList(
uiOutput("top1"),
uiOutput("screenTop1")
)
})
}
ui <- shinyUI(
fluidPage(tabPanel("Top", uiOutput("screenTop"))
)
)
shinyApp(ui=ui, server = server)
data.table
的子集化有问题吗?或者我使用反应的方式?闪亮的专家-我将不胜感激指导我做错了什么,以及为什么我还没有完全掌握反应性。抱歉,代码有点复杂,因为主要代码位于不同的文件结构中。
> sessionInfo()
R version 3.2.4 Revised (2016-03-16 r70336)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.9.6 shiny_0.13.2
编辑:解释
@Pork Chop 在下面的精彩评论中解释说 min
最终可能会强迫所有角色。因此,当面对 226 和“5”时,它变成了对“226”和“5”的测试,并且在逐个元素的基础上,“2”击败了“5”,因此选择“226”作为最小值,并显示所有行。
但是对于 10 和 20,它不是例如“226”和“10”第一位数字1<2。并显示了正确的最小值。 课程:观察类型并确保在需要时将 SelectInput input$vars 设置为 as.numeric
。
解谜!
你可以试试这个:
# choose subset of rows
#row.limit <- min(nrow(dataset1), input$limit1)
dt <- dt[1:input$limit1, ]
没有必要 "calculate" row.limit
。作为一个数字,您可以直接包含它。就像 dt[1:5, ]
更新您的子集:
row.limit <- min(nrow(dataset1), as.numeric(input$limit1))
编辑:
1) 由于 min
需要一个 numeric
变量来正确计算 min
您需要 cast
来更正数据类型:as.numeric(input$limit1)
,否则它将采用其他数字变量
2) 默认情况下 selectinput
是 string
类型,因为 selectInput()
和 selectizeInput()
使用 JavaScript
库 selectize.js
3) 如果你阅读 selectize documentation 你会发现 "Selectize is instantiated from a <input type="text"> element"
在您的开发中,我建议您尽可能多地使用 validate
和 need
,您可以找到一些文档 here。也尽量使用 print
为了说明需要最少的字符串:
如果您键入 ?min
,您会发现对于字符串的计算如下:
- 如果集合中存在 一个 字符串,它将强制整个集合键入
character
- 当取
min
时,字符串的排序是使用Lexicographical order完成的,意思是字母顺序,这意味着如果你取min(c("10",2))
,它将return"10"
as1
comes before2
once2
iscoerced
into the string