将dplyr中的get(paste0())对象解析为Shiny应用程序

加布里埃拉·奥林托(Gabriela Olinto)

我正在Shiny中构建一个新的应用程序,它需要执行包含一些inputID的灵活/反应性聚合数据集。我真的很喜欢dplyr,所以我用它来创建这个数据集。但是我在解析命令时遇到错误

...%>%summarise(get(paste0(substr(dis,1,4),“。mean”))=平均值(dis),count = n())

这是数据集的示例:

n=100
taxi <- data.frame(conversion=c(rep(1,20),rep(0,80)),
             day = sample(1:7, n, TRUE),
             hour = sample(0:23,n, TRUE),
             source= sample(1:4, n, TRUE),
             service= sample(1:5, n, TRUE),
             relevancy= sample(1:4, n, TRUE),
             tollfree= sample(c(0,1), n, TRUE),
             distance= sample(0:15, n, TRUE),
             similarity= sample(seq(0,1,0.01), n, TRUE),
             simi.names= sample(c('[0,0.25)','[0.25,0.5)','[0.5,0.75)','[0.75,1]'), n, TRUE),
             dist.names= sample(c('[0,1)','[1,2)','[2,3)','[3,4)','[4,15]'), n, TRUE),
             week= sample(1:7, n, TRUE),
             rel= sample(c(1,4), n, TRUE))

这是我最后一次尝试的样子:Ui.R

shinyUI(navbarPage("",
               tabPanel("Data",
                        sidebarLayout(
                          sidebarPanel(
                            selectInput("dataset", h5("Choose a dataset:"), choices = c("taxicabs", "liquor stores")),
                            radioButtons("discrete", h5("I want to discretize:"), choices = c("similarity", "distance","similarity & distance","none"),
                                               inline=F, selected = "none"),
                            radioButtons("agg", h5("I want to aggregate:"), choices = c("day in weekdays/weekends", "revelancy in binary revelancy",
                                                                                             "day in weekdays/weekends &  revelancy in binary revelancy","none"),
                                         inline=F, selected = "none"),
                            checkboxGroupInput("checkGroup", label = h5("Dataset Features:"), 
                                               choices = c("day","hour","source","service","relevancy","tollfree","distance","similarity"), inline = F,
                                               selected = c("day","hour","source","service","relevancy","tollfree","distance","similarity"))
                          ),
                          mainPanel(
                            numericInput("obs", label = h5("Number of observations to view"), 10, min = 5, max = 15, step = 1),
                            tableOutput("view") 
                          )
                        )
               ),
               tabPanel("Model",
                        h3("Best logistic model with logit link and variable selection via stepwise AIC "),
                        verbatimTextOutput("model"),
                        h3("MSE"),
                        tableOutput("measures")
               ),
               tabPanel("Graphs",
                        sidebarLayout(
                          sidebarPanel(    
                            selectInput('zcol', 'Variable to be fixed',  names(taxi[,-c(1,4,5,7,8,9,10,11)])),
                            selectInput("levels", "Levels",1:5)
                          ),
                          mainPanel(
                            plotOutput('plot3'),
                            plotOutput('plot1'),
                            plotOutput('plot2')
                          )
                        ))

 ))

服务器

shinyServer(function(input, output, session) {
datasetInput <- reactive({
switch(input$dataset,
       "taxicabs" = taxi,
       "liquor stores" = liq)
 })

observe({
if (input$discrete == 'none' & input$agg == 'none') {
  updateCheckboxGroupInput(session, "checkGroup", choices = c("day","hour","source","service","relevancy","tollfree","distance","similarity"),
                           inline=F, selected =c("day","hour","source","service","relevancy","tollfree","distance","similarity"))
} else if (input$discrete == 'none' & input$agg == 'day in weekdays/weekends'){
  updateCheckboxGroupInput(session, "checkGroup", choices = c("week","hour","source","service","relevancy","tollfree","distance","similarity"),
                           inline=F, selected =c("week","hour","source","service","relevancy","tollfree","distance","similarity"))
} else if (input$discrete == 'none' & input$agg == 'revelancy in binary revelancy'){
  updateCheckboxGroupInput(session, "checkGroup", choices = c("day","hour","source","service","rel","tollfree","distance","similarity"),
                           inline=F, selected =c("day","hour","source","service","rel","tollfree","distance","similarity"))
} else if (input$discrete == 'none' & input$agg == 'day in weekdays/weekends &  revelancy in binary revelancy'){
  updateCheckboxGroupInput(session, "checkGroup", choices = c("week","hour","source","service","rel","tollfree","distance","similarity"),
                           inline=F, selected =c("week","hour","source","service","rel","tollfree","distance","similarity"))
}

  else if(input$discrete == 'similarity' & input$agg == 'none') {
  updateCheckboxGroupInput(session, "checkGroup", choices = c("day","hour","source","service","relevancy","tollfree","distance","simi.names"),
                           inline=F, selected = c("day","hour","source","service","relevancy","tollfree","distance","simi.names"))
  } else if (input$discrete == 'similarity' & input$agg == 'day in weekdays/weekends'){
    updateCheckboxGroupInput(session, "checkGroup", choices = c("week","hour","source","service","relevancy","tollfree","distance","simi.names"),
                             inline=F, selected =c("week","hour","source","service","relevancy","tollfree","distance","simi.names"))
  } else if (input$discrete == 'similarity' & input$agg == 'revelancy in binary revelancy'){
    updateCheckboxGroupInput(session, "checkGroup", choices = c("day","hour","source","service","rel","tollfree","distance","simi.names"),
                             inline=F, selected =c("day","hour","source","service","rel","tollfree","distance","simi.names"))
  } else if (input$discrete == 'similarity' & input$agg == 'day in weekdays/weekends &  revelancy in binary revelancy'){
    updateCheckboxGroupInput(session, "checkGroup", choices = c("week","hour","source","service","rel","tollfree","distance","simi.names"),
                             inline=F, selected =c("week","hour","source","service","rel","tollfree","distance","simi.names"))
  }

  else if(input$discrete == 'distance' & input$agg == 'none') {
  updateCheckboxGroupInput(session, "checkGroup", choices = c("day","hour","source","service","relevancy","tollfree","dist.names","similarity"),
                           inline=F, selected =c("day","hour","source","service","relevancy","tollfree","dist.names","similarity"))
  } else if (input$discrete == 'distance' & input$agg == 'day in weekdays/weekends'){
    updateCheckboxGroupInput(session, "checkGroup", choices = c("week","hour","source","service","relevancy","tollfree","dist.names","similarity"),
                             inline=F, selected =c("week","hour","source","service","relevancy","tollfree","dist.names","similarity"))
  } else if (input$discrete == 'distance' & input$agg == 'revelancy in binary revelancy'){
    updateCheckboxGroupInput(session, "checkGroup", choices = c("day","hour","source","service","rel","tollfree","dist.names","similarity"),
                             inline=F, selected =c("day","hour","source","service","rel","tollfree","dist.names","similarity"))
  } else if (input$discrete == 'distance' & input$agg == 'day in weekdays/weekends &  revelancy in binary revelancy'){
    updateCheckboxGroupInput(session, "checkGroup", choices = c("week","hour","source","service","rel","tollfree","dist.names","similarity"),
                             inline=F, selected =c("week","hour","source","service","rel","tollfree","dist.names","similarity"))
  }

  else if(input$discrete == 'similarity & distance' & input$agg == 'none') {
  updateCheckboxGroupInput(session, "checkGroup", choices = c("day","hour","source","service","relevancy","tollfree","dist.names","simi.names"),
                           inline=F, selected =c("day","hour","source","service","relevancy","tollfree","dist.names","simi.names"))
  } else if (input$discrete == 'similarity & distance' & input$agg == 'day in weekdays/weekends'){
    updateCheckboxGroupInput(session, "checkGroup", choices = c("week","hour","source","service","relevancy","tollfree","dist.names","simi.names"),
                             inline=F, selected =c("week","hour","source","service","relevancy","tollfree","dist.names","simi.names"))
  } else if (input$discrete == 'similarity & distance' & input$agg == 'revelancy in binary revelancy'){
    updateCheckboxGroupInput(session, "checkGroup", choices = c("day","hour","source","service","rel","tollfree","dist.names","simi.names"),
                             inline=F, selected =c("day","hour","source","service","rel","tollfree","dist.names","simi.names"))
  } else if (input$discrete == 'similarity & distance' & input$agg == 'day in weekdays/weekends &  revelancy in binary revelancy'){
    updateCheckboxGroupInput(session, "checkGroup", choices = c("week","hour","source","service","rel","tollfree","dist.names","simi.names"),
                             inline=F, selected =c("week","hour","source","service","rel","tollfree","dist.names","simi.names"))
  }
 })

 observe({ 
if(input$discrete == "similarity & distance") {

  #all discrete 
  datasetagg <- reactive({ 
    eval(substitute(right_join(
      datasetInput() %>% select(cg) %>% group_by(cg) %>% summarise(count=n()),
      datasetInput() %>% filter(conversion==1) %>% select(icg) %>% count(cg)
    ) %>% mutate(prop.conv = n/count), 
    list(cg=as.symbol(input$checkGroup))))
  })

} else if(input$discrete == "similarity" | "distance") {

  # one continuous
  datasetagg <- reactive({ 
    eval(substitute(right_join( # the error is in the next line!
      datasetInput() %>% select(cg) %>% group_by(cg[-which(cg == dis)]) %>% summarise(get(paste0(substr(dis,1,4),".mean"))=mean(dis),count=n()),
      datasetInput() %>% filter(conversion==1) %>% select(cg) %>% count(cg[-which(cg == dis)])
    ) %>% mutate(prop.conv = n/count), 
    list(cg=as.symbol(input$checkGroup),
         dis=as.symbol(input$discrete))))
  })

} else if(input$discrete == "none") {

  # two  
  datasetagg <- reactive({ 
    eval(substitute(right_join(
      datasetInput() %>% select(cg) %>% group_by(cg[-which(cg == c('distance','similarity'))]) %>% summarise(dist.mean=mean(distance),simi.mean=mean(similarity),count=n()),
      datasetInput() %>% filter(conversion==1) %>% select(cg) %>% count(cg[-which(cg == c('distance','similarity'))])
    ) %>% mutate(prop.conv = n/count), 
    list(cg=as.symbol(input$checkGroup))))
  })
}
})

# head of the table  
output$view <- renderTable({
head(datasetagg(), n = input$obs)
})


 })

有什么建议?谢谢您的帮助!

尼克·肯尼迪

但是,真正的问题是您试图将其get(paste0(substr(dis,1,4),".mean"))用作摘要中的参数名称。R中的命名参数不会被评估,它们只是一段文字。

您粘贴的代码需要进行大量的重写。

  1. observe顶部的第一部分不必要地令人费解-可以将其简化为4个if语句,如图所示。

  2. 您无法reactive以这种方式动态定义您需要reactive声明一个带有其中所有条件逻辑的声明。在dplyr代码之外对输入变量进行任何必要的处理也很整洁。

  3. 当动态地为selectgroup_by定义列时可以使用最初打算使用的方法eval(substitute()),但这样会使代码难以正确编写。我认为最好使用功能的标准评估版本,例如select_group_by_对于input$checkgroup,您需要使用.dots参数(以及vars用于参数count_)。

  4. 在原始代码中,您将input$checkgroup变量强制为一个符号,该符号仅使用向量的第一个元素。

  5. 动态命名列的方法summarise_是使用setNames.dots参数。

我仍然不确定某些输出是否恰好是您想要的,特别是比例列,但这应该可以为您提供一些依据。

用户界面

library(shiny)

shinyUI(navbarPage("",
                   tabPanel("Data",
                            sidebarLayout(
                              sidebarPanel(
                                selectInput("dataset", h5("Choose a dataset:"), choices = c("taxicabs", "liquor stores")),
                                radioButtons("discrete", h5("I want to discretize:"), choices = c("similarity", "distance","similarity & distance","none"),
                                             inline=F, selected = "none"),
                                radioButtons("agg", h5("I want to aggregate:"), choices = c("day in weekdays/weekends", "relevancy in binary relevancy",
                                                                                            "day in weekdays/weekends &  relevancy in binary relevancy","none"),
                                             inline=F, selected = "none"),
                                checkboxGroupInput("checkGroup", label = h5("Dataset Features:"), 
                                                   choices = c("day","hour","source","service","relevancy","tollfree","distance","similarity"), inline = F,
                                                   selected = c("day","hour","source","service","relevancy","tollfree","distance","similarity"))
                              ),
                              mainPanel(
                                numericInput("obs", label = h5("Number of observations to view"), 10, min = 5, max = 15, step = 1),
                                tableOutput("view") 
                              )
                            )
                   ),
                   tabPanel("Model",
                            h3("Best logistic model with logit link and variable selection via stepwise AIC "),
                            verbatimTextOutput("model"),
                            h3("MSE"),
                            tableOutput("measures")
                   ),
                   tabPanel("Graphs",
                            sidebarLayout(
                              sidebarPanel(    
                                selectInput("zcol", "Variable to be fixed",  c("hour", "source", "tollfree", "rel")),
                                selectInput("levels", "Levels",1:5)
                              ),
                              mainPanel(
                                plotOutput("plot3"),
                                plotOutput("plot1"),
                                plotOutput("plot2")
                              )
                            ))

))

服务器

library("shiny")
library("dplyr")

n <- 1000
taxi <- data.frame(day = sample(1:7, n, TRUE),
                   hour = sample(0:23,n, TRUE),
                   source= sample(1:4, n, TRUE),
                   service= sample(1:5, n, TRUE),
                   relevancy= sample(1:4, n, TRUE),
                   tollfree= sample(c(0,1), n, TRUE),
                   distance= sample(0:15, n, TRUE),
                   similarity= sample(seq(0,1,0.01), n, TRUE),
                   simi.names= sample(c('[0,0.25)','[0.25,0.5)','[0.5,0.75)','[0.75,1]'), n, TRUE),
                   dist.names= sample(c('[0,1)','[1,2)','[2,3)','[3,4)','[4,15]'), n, TRUE),
                   week= sample(1:7, n, TRUE),
                   rel= sample(c(1,4), n, TRUE),
                   conversion = sample(0:1, n, TRUE))

shinyServer(function(input, output, session) {
  datasetInput <- reactive({
    switch(input$dataset,
           "taxicabs" = taxi,
           "liquor stores" = liq)
  })

  observe({
    choices <- c("day", "hour", "source", "service", "relevancy", "tollfree", "distance", "similarity")
    if (grepl("day in weekdays/weekends", input$agg))  {
      choices[1] <- "week"
    }
    if (grepl("relevancy", input$agg))  {
      choices[5] <- "rel"
    }      
    if (grepl("similarity", input$discrete)) {
      choices[8] <- "simi.names"
    }
    if (grepl("distance", input$discrete)) {
      choices[7] <- "dist.names"
    }
    updateCheckboxGroupInput(session, "checkGroup", choices = choices,
                               inline = F, selected = choices)
  })

  datasetagg <- reactive({ 
    cg <- input$checkGroup
    dis <- input$discrete
    cg_not_d_or_s <- cg[!(cg %in% c("distance", "similarity"))]
    if(input$discrete == "similarity & distance") {
      #all discrete 
      right_join(
        datasetInput() %>%
          select_(.dots = cg) %>%
          group_by_(.dots = cg) %>%
          summarise(count=n()),
        datasetInput() %>%
          filter(conversion==1) %>%
          select_(.dots = cg) %>%
          count_(vars = cg)
      ) %>% mutate(prop.conv = n/count)
    } else if(input$discrete %in% c("similarity", "distance")) {
      cg_not_dis <- cg[cg != dis]
        # one continuous
      right_join(
        datasetInput() %>%
          group_by_(.dots = cg_not_dis) %>%
          summarise_(.dots = setNames(c(paste0("mean(", dis, ")"), "n()"),
                                      c(paste0(substr(dis, 1, 4), ".mean"), "count"))) %>%
          select_(.dots = c(cg_not_dis, paste0(substr(dis, 1, 4), ".mean"), "count")),
        datasetInput() %>%
          filter(conversion==1) %>%
          select_(.dots = cg_not_dis) %>%
          count_(vars = cg_not_dis)
      ) %>% mutate(prop.conv = n/count)
    } else if(input$discrete == "none") {
      # two  
      right_join(
        datasetInput() %>%
          select_(.dots = cg) %>%
          group_by_(.dots = cg_not_d_or_s) %>%
          summarise(dist.mean=mean(distance), simi.mean=mean(similarity), count=n()),
        datasetInput() %>%
          filter(conversion==1) %>%
          select_(.dots = cg) %>%
          count_(vars = cg_not_d_or_s)
      ) %>% mutate(prop.conv = n/count)
    }
  })

  # head of the table  
  output$view <- renderTable({
    head(datasetagg(), n = input$obs)
  })

})

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在加载时将Shiny应用程序中的焦点设置为特定的UI元素

来自分类Dev

将非地理mapview对象放置到Shiny应用程序中

来自分类Dev

将R Shiny应用程序部署为独立应用程序

来自分类Dev

在 Shiny 应用程序中过滤 xts 对象

来自分类Dev

JSON将数据解析为android应用程序

来自分类Dev

paste0将“放在错误的位置

来自分类Dev

解析Android应用程序中的JSON对象

来自分类Dev

paste0和ifelse作为dplyr中管道的一部分

来自分类Dev

R:是否可以使用paste0函数(或某些类似函数)将存储在对象中的数据传递给新对象?

来自分类Dev

将输出文本从R SHINY存储到应用程序外部的对象

来自分类Dev

将应用程序设置为默认应用程序

来自分类Dev

如何在Shiny应用程序中为每个用户创建工作目录?

来自分类Dev

R Shiny:在闪亮的应用程序的反应性RMySQL查询中找不到表对象

来自分类Dev

在 Shiny Web 应用程序输出中获取“范围 0 表”

来自分类Dev

将应用程序日志文本文件解析为数组。

来自分类Dev

在Angular2应用程序中渲染JSON对象将导致“对象对象”

来自分类Dev

通过单击“ Shiny”应用程序中的链接来打开其他“ Shiny”应用程序

来自分类Dev

对象引用未设置为Xamarin iOS应用程序组中的对象实例

来自分类Dev

Json在Express应用程序中解析

来自分类Dev

将 instagram/youtube 嵌入到 Shiny R 应用程序中

来自分类Dev

我正在尝试将Json Object放入我的移动应用程序中,并将其解析为添加到Map中

来自分类Dev

如何通过url发送对象列表并在spring应用程序中解析

来自分类Dev

在ggplot调用中通过paste0()引用变量

来自分类Dev

您可以将应用程序配置为仅在应用程序的特定页面中才接收FCM消息吗?

来自分类常见问题

将应用程序模型的对象字段用作另一个应用程序中的ChoiceField窗体

来自分类Dev

将应用程序模型的对象字段用作另一个应用程序中的ChoiceField窗体

来自分类Dev

无法在Windows CE 6应用程序中为DataGrid的WinForm中的DataGridBoolColumn创建对象

来自分类Dev

将HTML链接放置到R Shiny应用程序

来自分类Dev

在Flask中重用应用程序对象

Related 相关文章

  1. 1

    在加载时将Shiny应用程序中的焦点设置为特定的UI元素

  2. 2

    将非地理mapview对象放置到Shiny应用程序中

  3. 3

    将R Shiny应用程序部署为独立应用程序

  4. 4

    在 Shiny 应用程序中过滤 xts 对象

  5. 5

    JSON将数据解析为android应用程序

  6. 6

    paste0将“放在错误的位置

  7. 7

    解析Android应用程序中的JSON对象

  8. 8

    paste0和ifelse作为dplyr中管道的一部分

  9. 9

    R:是否可以使用paste0函数(或某些类似函数)将存储在对象中的数据传递给新对象?

  10. 10

    将输出文本从R SHINY存储到应用程序外部的对象

  11. 11

    将应用程序设置为默认应用程序

  12. 12

    如何在Shiny应用程序中为每个用户创建工作目录?

  13. 13

    R Shiny:在闪亮的应用程序的反应性RMySQL查询中找不到表对象

  14. 14

    在 Shiny Web 应用程序输出中获取“范围 0 表”

  15. 15

    将应用程序日志文本文件解析为数组。

  16. 16

    在Angular2应用程序中渲染JSON对象将导致“对象对象”

  17. 17

    通过单击“ Shiny”应用程序中的链接来打开其他“ Shiny”应用程序

  18. 18

    对象引用未设置为Xamarin iOS应用程序组中的对象实例

  19. 19

    Json在Express应用程序中解析

  20. 20

    将 instagram/youtube 嵌入到 Shiny R 应用程序中

  21. 21

    我正在尝试将Json Object放入我的移动应用程序中,并将其解析为添加到Map中

  22. 22

    如何通过url发送对象列表并在spring应用程序中解析

  23. 23

    在ggplot调用中通过paste0()引用变量

  24. 24

    您可以将应用程序配置为仅在应用程序的特定页面中才接收FCM消息吗?

  25. 25

    将应用程序模型的对象字段用作另一个应用程序中的ChoiceField窗体

  26. 26

    将应用程序模型的对象字段用作另一个应用程序中的ChoiceField窗体

  27. 27

    无法在Windows CE 6应用程序中为DataGrid的WinForm中的DataGridBoolColumn创建对象

  28. 28

    将HTML链接放置到R Shiny应用程序

  29. 29

    在Flask中重用应用程序对象

热门标签

归档