闪亮的反应式下拉菜单行为不端(带有数字输入)

Posted

技术标签:

【中文标题】闪亮的反应式下拉菜单行为不端(带有数字输入)【英文标题】:Shiny reactive dropdown misbehaving (with number inputs) 【发布时间】:2016-11-10 00:17:11 【问题描述】:

这是一个汇总块的模型,显示了在其他地方绘制的值的前 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 在下面的伟大 cmets 解释说 min 最终可能会强迫所有人成为角色。因此,当面对 226 和“5”时,它变成了对“226”和“5”的测试,并且在逐个元素的基础上,“2”击败了“5”,因此选择“226”作为最小值,并且所有行都显示在其中。

但是对于 10 和 20,它不是例如“226”和“10”第一个数字 1课程:观察类型并确保在需要时将 SelectInput input$vars 设置为 as.numeric

谜底揭晓!

【问题讨论】:

【参考方案1】:

更新您的子集:

row.limit &lt;- min(nrow(dataset1), as.numeric(input$limit1))

编辑:

1) 由于min 需要一个numeric 变量来正确计算min,您需要cast 来更正数据类型:as.numeric(input$limit1),否则它将采用其他数值变量

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

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

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

澄清一下字符串:

如果你输入?min,你会发现字符串的计算如下:

如果集合中存在 one 字符串,它将强制整个集合输入character 当取min时,字符串的排序使用Lexicographical order完成,意思是按字母顺序,这意味着如果取min(c("10",2)),它将返回"10",因为12之前一旦2coerced 进入字符串

【讨论】:

感谢猪排,这是一种享受。请您在回答中解释原因,因为这已经让我发疯了半天。您是否总是需要检查输入变量的类型?你什么时候需要? 感谢 PorkChop 提供的额外内容和提示。我使用了print,很惊讶地看到它不时以 226 的最小值返回。奇怪的是字符串如何在某些时候被转换并且并不总是假发。 请注意,大多数伟大的程序员都比其他任何事情都更关注数据类型 如此真实-我应该更清楚我是在基本的情况下长大的!被R的懒惰评估宠坏了。再次感谢 @PorkChop 与提问者看到的行为相比,您能否解释一下这个正确的行为:min(c("1",2))。在 min-help 页面上,您会发现: ... == 数字或字符参数(请参阅注释)。【参考方案2】:

你可以试试这个:

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

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

【讨论】:

如果加载的数据小于选择的行,我担心数据回收。即数据集有 33 个项目,您选择视图 50?你最终得到下面的空白。知道为什么 input$limit1 中的更改不会重新计算 row.limit 而是选择全部?

以上是关于闪亮的反应式下拉菜单行为不端(带有数字输入)的主要内容,如果未能解决你的问题,请参考以下文章

带有大标题的 UISearchController,UI 在关闭时行为不端

asp二级联动下拉菜

在下拉菜单中添加动作按钮,我怎么知道按钮是不是被点击了闪亮

网页中的下拉菜单按了没反应,怎么解决??

如何在反应选择下拉菜单中的选项下添加子选项?

闪亮的响应式 UI 在同一条件变量上挂起多个 uiOutput 调用