функция map_df работает, но когда внутри Plumber api она не работает - PullRequest
0 голосов
/ 05 июля 2018

Я делаю развертывание для R с помощью пакета API для сантехника, сам код выполняется без ошибок локально, но когда он находится в среде сантехника, он выдает следующую ошибку <simpleError in do.call(private$func, args, envir = private$envir): 'what' must be a function or character string>

Вот пример:

    library('tidyverse')

    #data head using dput()
    tweets <- structure(list(text = c("@dottore_marcelo @LorranParadiso @1pedroOsilva @Ronaldocampos00 @jairbolsonaro Mas quem disse que @jairbolsonaro vai resolver todos os problemas do país tem 4 anos? Ele é um ponto de inflexão, quem sabe depois de 8 anos elegeremos um rocha ou um Amoedo, pois a estrada já estará pavimentada. Vamos pensar que no longo prazo a disputa será entre liber e conser", 
"@Ideias_Radicais Opiniao sobre a Marina Silva? Geraldo Alckmin? vai fazer oq se eles ganhar as eleiçoes?", 
"@pkogos E se a Marina Silva ou o Ciro gomes ganhar?", "@pkogos A França está dominada pela mentalidade esquerdista ! Se a Marina Silva ou o Ciro Ganhar vai acontecer o mesmo", 
"@cirogomes @guilhermefpenna @geraldoalckmin @MarinaSilva @jairbolsonaro @alvarodias_ Passo. Próximo.", 
"@joaopedro27696 @marx_araujo @folha 1) Não sou robô; 2) É \"Amoêdo\" e não \"Amoado\"; 3) Não voto com base em pesquisa, e sim em ideias, currículo e histórico... @jairbolsonaro é populista"
), created_at = structure(c(1527523890, 1527799974, 1527650098, 
1527724269, 1527881693, 1528111294), class = c("POSIXct", "POSIXt"
))), row.names = c(NA, 6L), class = "data.frame", .Names = c("text", 
"created_at"))

##data for date filtering

min_data_tweet <- min(tweets$created_at)
max_data_tweet <- max(tweets$created_at)

##regex I want to group_by 
reg_twe <- c("Bolsonaro"='bolsonaro|@jairbolsonaro',
             "João Amoêdo" ='amoedo|@joaoamoedonovo',
             "Marina Silva" ='marina silva|@marinasilva')

## This is the function that works without any problem
 map_df(reg_twe, 
             ~tweets %>% 
               filter(created_at >= min_data,
                      created_at <= max_data) %>%
               summarise(regex=.x,
                         n=sum(grepl(.x, text, ignore.case = TRUE))) %>%
               mutate(portal = 'Twitter'), 
             .id="Candidato") %>%
        select(Candidato, portal, n)

#Expected output

     Candidato  portal n
1    Bolsonaro Twitter 3
2  João Amoêdo Twitter 1
3 Marina Silva Twitter 4

Теперь, когда я помещаю это в функцию сантехника, загружая все данные перед этим, делаю это:

#' mencoes por candidato
#' @param pres bolsonaro amoedo marinasilva
#' @param fonte twitter noticias
#' @param min_data format: yyyy-mm-dd
#' @param max_data 
#' @get /candidato_mencoes

cat('Running candidato_mencoes\n')

function(min_data = min_data_tweet, 
         max_data = max_data_tweet){

      map_df(reg_twe, 
             ~tweets %>% 
               filter(created_at >= min_data,
                      created_at <= max_data) %>%
               summarise(regex=.x,
                         n=sum(grepl(.x, text, ignore.case = TRUE))) %>%
               mutate(portal = 'Twitter'), 
             .id="Candidato") %>%
        select(Candidato, portal, n)

}
## I get this error
<simpleError in do.call(private$func, args, envir = private$envir): 'what' must be a function or character string>
## sometimes when tweaking the function, this warning
Warning in formals(fun) : argument is not a function

Это функция (другой файл) для запуска файла plumber.R (предыдущая функция)

    library('plumber')
setwd("~/path/to/plumber")

pr <- plumber::plumb("plumber.R")
pr$run(port = 2424)

Для подключения к API: localhost:2424/candidato_mencoes

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

1 Ответ

0 голосов
/ 05 июля 2018

Хорошо, ошибка была моей и довольно простой. Я хотел знать, когда была вызвана функция с помощью cat (), но это было не в том месте, потому что сантехник не создавал функцию. Вторая часть должна быть такой:

#' mencoes por candidato
#' @param pres bolsonaro amoedo marinasilva
#' @param fonte twitter noticias
#' @param min_data format: yyyy-mm-dd
#' @param max_data 
#' @get /candidato_mencoes

    function(min_data = min_data_tweet, 
             max_data = max_data_tweet){
### put this cat() inside the function.
        cat('Running candidato_mencoes\n')

          map_df(reg_twe, 
                 ~tweets %>% 
                   filter(created_at >= min_data,
                          created_at <= max_data) %>%
                   summarise(regex=.x,
                             n=sum(grepl(.x, text, ignore.case = TRUE))) %>%
                   mutate(portal = 'Twitter'), 
                 .id="Candidato") %>%
            select(Candidato, portal, n)

    }
...