r之Shiny 的响应式(Reactive)下拉菜单行为不当(带有数字输入)

JustinYoung 阅读:78 2025-06-02 22:19:02 评论:0

这是一个摘要 block 的模型,显示了在其他地方绘制的值的前 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 的子集设置有问题吗?或者我使用响应式(Reactive)的方式? Shiny 的专家 - 我希望能指导我做错了什么,以及为什么,因为我还没有完全掌握 react 性。抱歉,代码有点复杂,因为主要代码位于不同的文件结构内。

> 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。并显示了正确的最小值。 类(class):观察类型并确保在需要时将 SelectInput input$vars 设置为 as.numeric

谜底揭晓!

请您参考如下方法:

更新您的子集:

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"

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

澄清字符串的最小值:

如果您输入?min你会发现对于字符串的评估如下:

  • 如果集合中存在 one 字符串,它将强制整个集合键入 character
  • 服用min时字符串的排序是使用 Lexicographical order 完成的,表示按字母顺序排列,这意味着如果您采用 min(c("10",2)) ,它将返回 "10"1出现在 2 之前一次2coerced到字符串中


标签:React
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号