2014-10-27 69 views
4

我想用Shiny创建一个应用程序,我希望用户能够选择图中每一行的颜色。总的想法是导入应用程序中的数据,然后绘制数据中的每个变量。我尝试使用shinysky软件包中的colorpicker'jscolorInput',它放置在ui.r文件中时工作正常,但由于我希望我的应用程序对于每个上传的数据集都是动态的,因此需要将ColorPicker放在服务器中。 R,使用反应函数。 放置在服务器中时,'jscolorInput'不起作用。闪亮服务器中的动态颜色输入

我想要做的是:

  1. 多次重现颜色拾取作为 变量的数据数量
  2. 采取从颜色的输入,并通过它 为色彩参数剧情

我在闪亮的开发和计算器上都很新,所以请原谅我的错误。

这是一个可重复的例子,不起作用。

require(shinysky) 
require(shiny) 

dat <- data.frame(matrix(rnorm(120, 2, 3), ncol=3)) 

runApp(list(
ui = bootstrapPage(
    # The reactive colorpicker 
    uiOutput('myPanel'), 
    # The plot 
    plotOutput('plot') 
), 
server = function(input, output) { 
    # Print as many colorpickers as the columns in the dataset 
    cols <- reactive({ 
     n <- ncol(dat) 
     for(i in 1:n){ 
      print(jscolorInput(paste("col", i, sep="_")))  
     } 
    }) 

     output$myPanel <- renderPrint({cols()}) 
    # Put all the input in a vector 
    colors <- reactive({ 
     n <- ncol(dat) 
     lapply(1:n, function(i) { 
      input[[paste("col", i, sep="_")]] 
     }) 
    }) 

    output$plot <- renderPlot({ 
     cols <- ifelse(is.null(input$col_1), rep("000000 ", n), colors()) 
     plot(dat[,1], col= paste0("#", cols[1], "")) 
           for(i in 2:ncol(dat))lines(dat[,i], col=cols[i]) 
    }) 

} 
)) 

回答

2

这是您正在尝试做的工作版本。看看我们的代码之间的差异,你的代码有几个问题。另外,请注意,我没有使用shinysky,因为它不再有色彩选择器(它被移动到不活动的其他包),所以我使用shinyjs中的inputColour

library(shiny) 
library(shinyjs) 

dat <- data.frame(matrix(rnorm(120, 2, 3), ncol=3)) 

runApp(shinyApp(
    ui = fluidPage(
    uiOutput('myPanel'), 
    plotOutput("plot") 
), 
    server = function(input, output, session) { 
    cols <- reactive({ 
     lapply(seq_along(dat), function(i) { 
     colourInput(paste("col", i, sep="_"), "Choose colour:", "black")   
     }) 
    }) 

    output$myPanel <- renderUI({cols()}) 

    # Put all the input in a vector 
    colors <- reactive({ 
     lapply(seq_along(dat), function(i) { 
     input[[paste("col", i, sep="_")]] 
     }) 
    }) 

    output$plot <- renderPlot({ 
     if (is.null(input$col_1)) { 
     cols <- rep("#000000", ncol(dat)) 
     } else { 
     cols <- unlist(colors()) 
     } 
     plot(dat[,1], col = cols[1]) 
     for(i in 2:ncol(dat)) lines(dat[,i], col = cols[i]) 
    }) 
    } 
)) 

免责声明:我的shinyjs

+0

笔者有一个'updateColourInput()'动态更新或重置窗口小部件? – rmf 2015-12-22 20:15:43

+1

是的,如果它没有被打磨和彻底的话,我绝不会在包中发布一个函数:)事实上,你可以使用'shinyjs :: reset()'来重置它(或任何其他输入) – 2015-12-23 01:58:38