传递公式以在数据框中添加新列

时间:2013-09-24 06:32:51

标签: r shiny shiny-server

我正在尝试使用闪亮的网络应用程序为数据框创建一个新列 如果我们在此应用程序的公式选项中键入公式,它应该接收该公式并应创建数据框的新列。我试过attach(),subset()函数,没用... ... 能帮帮我吗。

UI:

library(shiny)
shinyUI(pageWithSidebar(
  headerPanel( "Data Frame", "Data Frame"),
  sidebarPanel(

    wellPanel(

      fileInput('file', 'Select csv file', accept=c('text/csv') ),

      checkboxInput('header', 'Header', TRUE),

      gsub("label class=\"radio\"", "label class=\"radio inline\"",
           radioButtons('sep', 'Separator', c(Comma=',', Semicolon=';', Tab='\t' )))

    ),

    wellPanel(
      checkboxInput('addcol', 'Create New Variable', FALSE),

      conditionalPanel(condition="input.addcol!=0",
                       textInput('newvar', "Variable name","" ),
                       textInput('newformula', "Formula",""),
                       actionButton("apply","Apply Changes")
      )      
    )

  ),

mainPanel(
  tableOutput('contents') 
)
)) 

服务器:

library(shiny)
library(stats)
library(reshape)
require(utils)
shinyServer(function(input,output,session){

  dataset = reactive({
    inFile<-input$file
    if(is.null(inFile))
      return(NULL)
    read.csv(inFile$datapath, header=input$header, sep=input$sep)
  })

  alterdata = reactive({
    if(input$apply==0){
      dataset<-transform(dataset(), new='')
      dataset <- rename(dataset, c(new=input$newvar))
      dataset
    }
    else
    {
      attach(dataset())
      dataset<-dataset()
      dataset$new<-cat(input$newformula, "\n")
      detach(dataset())
      dataset <- rename(dataset, c(new=input$newvar))
      dataset
    }

    #dataset
    })


  data = reactive({
    if(input$addcol!=0)
    {
      alterdata()
    }
    else
    {
      dataset()
    }
  })    

  output$contents<-renderTable({
    if (is.null(input$file)) { return() }                            
    data()
  })

  })

})

1 个答案:

答案 0 :(得分:0)

我认为你应该从dplyr包中尝试mutate_。 像

这样的东西
        mutate_formula <- setNames(lazyeval::interp(input$newformula), input$newvar)
        new_dataset <- dataset() %>%
            mutate_(.dots = mutate_formula)