3

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

界面:

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()
  })

  })

})
4

1 回答 1

0

我认为您应该尝试 dplyr 包中的 mutate_ 。就像是

        mutate_formula <- setNames(lazyeval::interp(input$newformula), input$newvar)
        new_dataset <- dataset() %>%
            mutate_(.dots = mutate_formula)
于 2015-05-19T10:47:33.327 回答