map_df 函数有效,但在 Plumber api 内部时失败
map_df function works but when inside Plumber api it fails
我正在通过管道工包 api 为 R 进行部署,代码本身 运行 在本地时是完美的,但是当它在管道工的环境中时,它会给出以下错误 <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
到目前为止,我已经读到这可能是变量作为函数名称的冲突,但我无法追踪到它。问题 运行 仅当 运行 在水管工中出现时,我不确定它是否是一个错误。
好的,错误是我的,很简单。我想知道什么时候使用“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)
}
我正在通过管道工包 api 为 R 进行部署,代码本身 运行 在本地时是完美的,但是当它在管道工的环境中时,它会给出以下错误 <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
到目前为止,我已经读到这可能是变量作为函数名称的冲突,但我无法追踪到它。问题 运行 仅当 运行 在水管工中出现时,我不确定它是否是一个错误。
好的,错误是我的,很简单。我想知道什么时候使用“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)
}