闪亮的反应性下拉行为不正常(带数字输入)

时间:2016-07-07 15:29:50

标签: r shiny data.table shiny-reactivity

这是一个摘要块的模型,显示正在其他地方绘制的值的顶部或底部10。

问题

更改变量名称或排序方向工作正常,但更改要显示的数据量限制(limit1),最初显示10但最近将其更改为5,最终显示所有数据。更改为更高的值有时可行,但并非总是如此。这很奇怪!

好的

Deafult app on startup

不行

App when choose 5

CODE

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输入$ vars设置为as.numeric

神秘解释!

2 个答案:

答案 0 :(得分:4)

使用以下内容更新您的子集:

row.limit <- min(nrow(dataset1), as.numeric(input$limit1))

修改

1)由于min需要numeric变量来正确计算min,您需要cast来更正数据类型:as.numeric(input$limit1),否则它会取其他数字变量

2)默认情况下,selectinput的类型为stringselectInput()selectizeInput()使用JavaScriptselectize.js

3)如果您阅读selectize documentation,您会发现"Selectize is instantiated from a <input type="text"> element"

在您的开发过程中,我建议您尽可能使用validateneed,您可以找到一些文档here。也尽量使用print

澄清一小部分字符串:

如果您键入?min,您会发现对于字符串,评估如下:

  • 如果集合中存在一个字符串,则会强制整个集合键入character
  • 在使用min时,字符串的排序是使用Lexicographical order完成的,这意味着按字母顺序排列,这意味着如果您使用min(c("10",2)),它将返回"10" as 12 2 coerced之前mailto进入字符串

答案 1 :(得分:1)

你可以试试这个:

# choose subset of rows  
  #row.limit <- min(nrow(dataset1), input$limit1) 
  dt <- dt[1:input$limit1, ]

“计算”row.limit不是必需的。作为一个数字,您可以直接包含它。这就像dt[1:5, ]