2017-03-31 86 views
1

我正在尝试创建一个应用程序,根据用户的选择将子集数据的数据框。之后,我想创建一个新的数据框,其中包含col1 abd的唯一值,并根据用户的选择(例如,从广泛的日期的长形状中)将新数据框添加为现有数据框的新列。 任何想法??? 我的数据集时,首先用户选择“A”在闪亮的现有数据框上追加数据帧

的结果是这个

col1 col2 col3 col4 
    1 a  1 
    2 a  20  22 
    3 a  15  15 
    4 a    2 

然后,如果用户选择c中的那

col1<-rep(c(1:4),3) 
col2<-c('a','b','c','a','b','c','a','b','c','a','b','c') 
col3<-c(1,2,3,NA,NA,14,15,NA,NA,20,21,22) 
col4<-c(NA,NA,1,2,3,14,15,20,21,22,NA,NA) 
df<-data.table(col1,col2,col3,col4) 



# Define UI for application that draws a histogram 
ui <- fluidPage(

    # Application title 
    titlePanel("Old Faithful Geyser Data"), 

    selectInput('Ind', 'Index',choices = c(unique(df$col2))), 
    dataTableOutput('Table') 
) 
# Define server logic required to draw a histogram 
server <- function(input, output) { 



dfsel<-reactive({dfnew<-subset(df,col2==input$Ind) 
dfnew 
}) 
output$Table<-renderDataTable(dfsel()) 

} 

# Run the application 
shinyApp(ui = ui, server = server) 

什么IA我想才达到的新的数据帧将

col1 col2 col3 col4 col2 col3 col4 
    1 a  1    c    21 
    2 a  20  22  c  14  14 
    3 a  15  15  c  3  1 
    4 a    2  c  22 

+2

您有什么问题? –

+0

我想在我创建的数据集dfsel中插入,每次用户选择另一个输入时,都会在dfsel上添加对应子集。一个问题是列名是相同的,我不能追加它们,所以我可以改变列名称并追加新值? – Aleha

+0

您想在用户选择子集时将行添加到显示的表中吗? –

回答

1

好吧,我想我明白你想要什么。这是我相信的。

我做了以下更改例如

  • 增加了一个新的DataTable(rv$dfnew)作为reactiveValues跟踪我们的数据表,因为它生长
  • 改变了显示屏显示的当前选择的部分数据框以及不断增长的dfnew
  • 添加了一个计数变量,该计数变量附加到列上,以便我们继续保持它们都是唯一的。
  • 添加了一个actionButton doAppendCols来追加这些列。

下面是代码:

library(shiny) 
library(data.table) 
col1<-rep(c(1:4),3) 

col2<-c('a','b','c','a','b','c','a','b','c','a','b','c') 
col3<-c(1,2,3,NA,NA,14,15,NA,NA,20,21,22) 
col4<-c(NA,NA,1,2,3,14,15,20,21,22,NA,NA) 
df<-data.table(col1,col2,col3,col4) 

# Define UI for application that draws a histogram 
ui <- fluidPage(

    # Application title 
    titlePanel("Append Columns"), 

    selectInput('Ind', 'Index',choices = c(unique(df$col2))), 
    actionButton("doAppendCols","Append Columns"), 
    h2("Selected Data"), 
    dataTableOutput('selTable'), 
    h2("New Table"), 
    dataTableOutput('newTable') 
) 
# Define server logic required to draw a histogram 
server <- function(input, output) { 

    rv <- reactiveValues(dfnew=NULL,count=0) 

    observeEvent(input$doAppendCols,{ 
    rv$count <- rv$count+1 
    dfs <- dfsel() 
    # add a running number as suffix to column names to make the columns unique 
    newsuffix <- paste0(".",rv$count) 
    ncols <- ncol(dfs) 
    names(dfs)[2:ncols] <- paste0(names(dfs)[2:ncols],newsuffix) 
    if(is.null(rv$dfnew)){ 
     rv$dfnew <- dfs 
    } else { 
     rv$dfnew <- merge(rv$dfnew,dfs,by="col1") 
    } 
    }) 

    dfsel<-reactive({ 
    df<-subset(df,col2==input$Ind) 
    df <- df[order(df$col1),] 
    }) 
    output$selTable<-renderDataTable(dfsel()) 
    output$newTable<-renderDataTable(rv$dfnew) 

} 

# Run the application 
shinyApp(ui = ui, server = server) 

这里是输出示例:

enter image description here

+0

谢谢!这些都是我想要做的事情,而且我对列的名字有问题!谢谢!!! – Aleha