2016-07-07 21 views
2

这是一个摘要块的示意图,显示正在其他地方绘制的值的顶部或底部10。闪亮的被动下拉行为不当(带有数字输入)

ISSUE

改变变量名或排序方向工作正常,但改变的数据多少来显示极限(​​),作品最初表示10,但改变它不像5结束了示出所有的数据。有时可以更改更高的值,但并非总是如此。这很奇怪!

所以OK

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) 

是否与的子集的问题?或者我使用反应的方式?闪亮的专家 - 我会很欣赏指导我做错了什么,以及为什么我还没有完全掌握反应能力。由于主代码位于不同的文件结构内,因此代码变得有些复杂。

> 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印章的下面大的意见解释说,min可以结束一切强迫字符。因此,当面对226和“5”时,它成为“226”和“5”的测试,并且在逐元素基础上“2”击败“5”,因此选择“226”作为最小值和显示的所有行。

但是对于10和20,它不是例如“226”和“10”的第一位数字1 < 2.显示正确的最小值。 课程:观看类型,并确保在需要时将SelectInput输入$ vars设置为as.numeric

神秘解释!

回答

4

更新您的子集:

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

编辑:

1)作为min需要numeric变量来计算min正常,你需要cast到正确的数据类型:as.numeric(input$limit1),否则将采用其他数值变量

2)默认情况下,selectinputstring型的,如selectInput()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"1到来之前2一次2coerced为字符串
+0

感谢猪排,工作的一种享受。请你可以**解释为什么**在你的回答中,因为这已经让我生气了半天。你总是需要检查输入变量的类型吗?你什么时候需要? – micstr

+0

感谢PorkChop的额外和技巧。我使用了'print',并且很惊讶地发现它不断以226分钟作为分钟。奇怪的是,字符串如何在一段时间内进行转换,并不总是假发。 – micstr

+1

请注意,绝大多数优秀的程序员都比其他任何东西都更关注数据类型 –

1

你可以试试这个:

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

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

+1

我很担心数据回收如果加载的数据小于所选的行数。即数据集有33个项目,你选择视图50?你最终会得到空白。任何想法为什么'input $ limit1'中的更改不会重新计算'row.limit'并选择全部? – micstr

+0

好点。对于最后一期,请参阅猪排的答案。 – Jimbou