Eu gostaria de usar o operador de canal %>%
introduzido no magrittr
pacote em um pacote que eu mesmo escrevi para encadear dplyr
transformações de dados. magrittr
está listado como Import
no DESCRIPTION
arquivo. Depois de carregar meu próprio pacote e testar a função que usa o operador de tubo, recebo a seguinte mensagem de erro:
Erro em functionname (parâmetro,: não foi possível encontrar a função "%>%"
Mudar %>%
para magrittr::%>%
no código-fonte da função também não ajuda porque o pacote não pode mais ser compilado.
r
namespaces
magrittr
alexander keth
fonte
fonte
Respostas:
Deveria ter funcionado corretamente se você tivesse
magrittr
listado emDepends
. No entanto, isso não é recomendado . Em vez disso, você deixamagrittr
emImports
e adicione a seguinte linhaNAMESPACE
:Eu sugiro a leitura de extensões R escrevendo . A sua pergunta é abordada nos parágrafos 1.1.3 e 1.5.1.
fonte
roxygen2
, você pode adicionar#' importFrom magrittr "%>%"
para que NAMESPACE seja preenchido automaticamente duranteroxygenize()
.#' @importFrom magrittr "%>%"
%>%
internamente em seu pacote. Se sua API requer que os usuários encadeiem funções usando%>%
, eles ainda terão que carregar explicitamentemagrittr
. Uma maneira de resolver esse problema é reexportar a função. Aqui está um exemplo de como fazer isso.Agora existe uma maneira mais fácil de apoiar o tubo em seus pacotes. O maravilhoso pacote
usethis
tem a funçãouse_pipe()
. Você executa essa função uma vez e ela trata de tudo. É assim que ause_pipe()
função é descrita nausethis
documentação:fonte
use_pipe()
ao código que usa para construir o pacote? Por exemplo, eu corro:usethis::use_description(usethis_description); usethis::use_build_ignore(directories); usethis::use_build_ignore(paste0(pkg_name, ".Rproj")); if (file.exists(file.path(pkg_path, "NAMESPACE"))) { file.remove(file.path(pkg_path, "NAMESPACE")) }; devtools::document(pkg_path); devtools::check(pkg_path); devtools::load_all(pkg_path); devtools::install(pkg_path)
. Eu apenas adicionariause_pipe()
no início?usethis
funções uma vez quando está desenvolvendo o pacote. Essas funções, então, adicionam as partes necessárias às instruções de construção e tudo mais.Uma solução adicional - use o
roxygen
pacote. É implementado como parte dodevtools
pacote. Uma vezdevtools
instalado, chamardevtools::document()
irá atualizar seuNAMESPACE
para você. Ele também cria arquivos .Rd com documentação, o que é útil.Tudo o que você faz é adicionar um comentário especial no formato
#' @import packagename
a um arquivo para importar todas as funções desse pacote, ou#' @importFrom packagename functionname
para importar uma função. Você pode ter quantos comentários quiser em seus arquivos, portanto, pode ter um conjunto deles no topo de cada arquivo, ou com cada uma de suas funções que precisa de uma função externa.Em seguida, você executa
devtools::document()
e analisa seu código procurando esses comentários e, em seguida, cria umNAMESPACE
arquivo apropriado para você. Fácil.fonte
Supondo que você esteja usando o RStudio, o
devtools
pacote do Hadley , e listadomagrittr
na seção Importações doDESCRIPTION
arquivo, aqui estão as etapas que executei para fazer o%>%
trabalho em minhas funções de pacote.Primeiro, escreva a função
foo.R
:Segundo, corra
devtools::document()
.Terceiro, corra
devtools::load_all()
.Um arquivo como este será criado em seu
R/
diretório e sua função deverá funcionar conforme o esperado.fonte
@name %>%
daqui?