R Блестящая ошибка: неиспользованный аргумент, но строка ошибки отличается - PullRequest
0 голосов
/ 29 августа 2018

Я пишу приложение Shiny, которое выбирает фрейм данных на основе ввода в Carrier и выполняет над ним некоторые функции. Вот мой код:

library(shiny)
library(ggplot2)
library(dplyr)
library(rlang)
library(shinyWidgets)
library(rstudioapi)

ui <- fluidPage(


  # Give the page a title
  titlePanel("Rate Analysis"),

  # Generate a row with a sidebar
  sidebarLayout(      

    # Define the sidebar with one input
    sidebarPanel(
      selectInput("ProductType","Product Type: (Choose One)",choices=c("t","r")),
      selectInput("inSelect","Carrier: (Choose One)",choices=unique(c(t_rates_names,r_rates_names))),
      selectInput("Category","Category: (Choose One)",choices=c("Age","Term","Band","Class","Gender")),
      sliderInput("discount","% Discount:",min=0,max=100,value=0),
      width=3
    ),

    # Create a spot for the barplot
    mainPanel(
      plotOutput("Minimum_Rates")  
    )

  )
)

server <- function(input, output, session) {
  observe({
    req(input$ProductType)
    x<-sym(input$ProductType)
    updateSelectInput(session,"inSelect",label=paste("test"),choices=eval(parse(text=paste0(x,"_rates_names"))))
  })

  output$Minimum_Rates<-renderPlot({
    req(input$inSelect)
    req(input$Category)
    req(input$discount)
    req(input$ProductType)
    carrier_name<-(input$inSelect)
    carrier<-eval(parse(text=input$inSelect))
    type<-input$ProductType
    category<-sym(input$Category)
    discount<-input$discount
    fee_name=eval(parse(text=paste0(substr(carrier_name,1,nchar(carrier_name)-6),"_fees"))) #gets actual list of fees
    if(type=="t"){
      tMinTable<-removeCarrierRatesAndFindMinimumRates(t_list_rates)
      carrier%>%
      createRatesComparedToTMin(carrier)%>%
      original_percent_higher<-carrier$Percent_Higher%>%
      findRatesFromPrems(carrier,fee_name)%>%
      original_rates<-carrier$`Rates per Thousand`%>%
      discountRatesAndFindNewPrems(carrier,discount/100,fee_name)%>%
      group_by(!!!category) %>%
      summarise(Current_Comparison=sum(original_percent_higher)) %>%
      ggplot(aes_string(input$category,"Current_Comparison"))+geom_bar(stat="identity",position="dodge") + geom_text(aes(label=scales::percent(Current_Comparison)),size=3.2,vjust=-0.5,position=position_dodge(width=1))
    }
    else{
      rMinTable<-removeCarrierRatesAndFindMinimumRates(r_list_rates)
      carrier%>%
      createRatesComparedToRMin(carrier)%>%
      original_percent_higher<-carrier$Percent_Higher%>%
      findRatesFromPrems(carrier,fee_name)%>%
      original_rates<-carrier$`Rates per Thousand`%>%
      discountRatesAndFindNewPrems(carrier,discount/100,fee_name)%>%
      group_by(!!!category) %>%
      summarise(Current_Comparison=sum(original_percent_higher),Hypothetical_Comparison=sum(New_Percent_Higher)) %>%
      ggplot(aes_string(input$category,"Current_Comparison"))+geom_bar(stat="identity",position="dodge") + geom_text(aes(label=scales::percent(Current_Comparison)),size=3.2,vjust=-0.5,position=position_dodge(width=1))
    }
  })
}
shinyApp(ui=ui,server=server)

Ошибка:

Warning: Error in discountRatesAndFindNewPrems: unused argument (fee_name)
  170: function_list[[i]]
  169: freduce
  168: _fseq
  167: eval
  166: eval
  164: %>%
  163: renderPlot [.../app.R#54]
  161: func
  121: drawPlot
  107: <reactive:plotObj>
   91: drawReactive
   78: origRenderFunc
   77: output$Minimum_Rates
    1: runApp

К сожалению, я не могу поделиться данными или функциями по юридическим причинам, но я проверил функции за пределами блестящей, которая работала просто отлично. Ошибка говорит, что я не использую аргумент в функции discountRatesAndFindNewPrems, но предупреждение указывает на строку # 54, которая является строкой carrier%>%. Я новичок в dplyr и блестяще в целом и не могу понять, может ли оператор «%>%» использоваться только с функциями dplyr, потому что я написал другое блестящее приложение, которое использовало dplyr и оператор «%>%», но я только использовал функции dplyr в этом приложении с "%>%". Что-то еще мне не хватает, например, сделать Carrier реактивным или что-то в этом роде?

1 Ответ

0 голосов
/ 29 августа 2018

Посмотрите на эти вопросы. Они более подробно объясняют, как работает канал%>% и как убедиться, что он помещает ваши данные в правильное место при объединении функций: Использование `%>%` с `lm` и` rbind` и Использование%>% трубы и точка (.) нотации

При использовании канала %>% выходные данные левой части канала отправляются в 1-й аргумент в правой части (или в аргумент, указанный с помощью оператора .). Если бы мне пришлось угадывать, я бы сказал, что это конкретное сообщение об ошибке происходит, потому что discountRatesAndFindNewPrems принимает 3 аргумента, а вы передаете его 4.

  1. Выход канала идет в 1-й аргумент,
  2. carrier переходит во 2-е,
  3. и discount/100 в 3-й.
  4. fee_name, следовательно, некуда идти, и это выдает ошибку unused argument.

Я думаю, что лучшая стратегия для использования канала с функциями не-dplyr - всегда указывать, куда выводится канал, с оператором .. Почти во всех случаях вы можете просто указать . в качестве аргумента функции, и канал отправит вывод левой функции в этот аргумент.

Например, этот код:

carrier %>%
    createRatesComparedToRMin(carrier)

На самом деле делает то же самое, что и это:

createRatesComparedToRMin(carrier, carrier)

Что я предполагаю не то, что вы хотели. Намного понятнее, что происходит, если вы используете точку .:

carrier %>%
    createRatesComparedToRMin(.)

Я вижу кучу других странных проблем с вашей функцией, которые могут вызвать проблемы:

1) Нельзя передать в операторы присваивания для сохранения промежуточных значений (см. Этот вопрос: Возможности R pipe (%>%) - хранение и частичное использование? )

...
createRatesComparedToRMin(carrier) %>%
original_percent_higher <- carrier$Percent_Higher %>%
...

Этот раздел должен выдавать ошибку, как мы видим в этом примере:

mtcars %>%
    dog <- sum() %>%
    sum(volcano)

Error in mtcars %>% dog <- sum() %>% sum(volcano) : 
  could not find function "%>%<-"

Если вы хотите сохранить промежуточные значения, вам нужно остановить конвейер и присвоить результат следующим образом:

dog <- mtcars %>%
    sum()
sum(dog, volcano)

[1] 704849.2

Кроме того, вы можете использовать пользовательскую функцию, которая присваивает результат, как описано в связанном вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...