Erro: não foi possível encontrar a função ... em R

177

Isso deve ser uma pergunta frequente, portanto, seja o mais completo possível. A resposta é uma resposta da comunidade, portanto, fique à vontade para editar se achar que algo está faltando.

Esta questão foi discutida e aprovada na meta.

Estou usando R e tentei, some.functionmas recebi a seguinte mensagem de erro:

Error: could not find function "some.function"

Esta questão surge com muita regularidade. Quando você recebe esse tipo de erro no R, como você pode resolvê-lo?

Joris Meys
fonte
5
Antes de votar para encerrar esta pergunta, leia primeiro esta discussão sobre meta: meta.stackexchange.com/questions/101892/…
Andrie
2
Se tudo isso falhar, tente grepping o código-fonte para a base R e seus pacotes instalados
nullglob
3
@nullglob Isso parece um pouco extremo :-)
Gavin Simpson
Eu tenho uma pergunta relevante: stackoverflow.com/questions/23357551/… . Nesse caso, QUALQUER Rcomando falha, mas q()! Conselho será muito apreciado!
Aleksandr Blekh
Talvez bobo, mas tome cuidado para não nomear a saída da função como a própria função. [Aprendido pela experiência ...]
user3507584 14/17

Respostas:

126

Há algumas coisas que você deve verificar:

  1. Você escreveu o nome da sua função corretamente? Os nomes diferenciam maiúsculas de minúsculas.
  2. Você instalou o pacote que contém a função? install.packages("thePackage")(Isso só precisa ser feito uma vez)
  3. Você anexou esse pacote ao espaço de trabalho? require(thePackage)ou library(thePackage)(isso deve ser feito toda vez que você inicia uma nova sessão R)
  4. Você está usando uma versão R mais antiga, onde essa função ainda não existia?

Se você não tem certeza de qual pacote está localizado, você pode fazer algumas coisas.

  1. Se você tem certeza de que instalou e anexou / carregou o pacote certo, digite help.search("some.function")ou ??some.functionpara obter uma caixa de informações que pode informar em qual pacote ele está.
  2. finde getAnywheretambém pode ser usado para localizar funções.
  3. Se você não tem nenhum indício sobre o pacote, você pode usar findFnno sospacote, como explicado em esta resposta .
  4. RSiteSearch("some.function")ou pesquisar com rdocumentation ou rseek são maneiras alternativas de encontrar a função.

Às vezes, você precisa usar uma versão mais antiga do R, mas execute o código criado para uma versão mais recente. Funções adicionadas recentemente (por exemplo, hasName no R 3.4.0) não serão encontradas. Se você usa uma versão R mais antiga e deseja usar uma função mais nova, pode usar o backports do pacote para disponibilizar essas funções. Você também encontra uma lista de funções que precisam ser suportadas no repositório git de backports . Lembre-se de que as versões R anteriores à R3.0.0 são incompatíveis com os pacotes criados para a R3.0.0 e versões posteriores.

Joris Meys
fonte
Oi Joris, tenho uma pergunta rápida. Eu sou novo no R, mas consegui instalá-lo com sucesso. Eu gostaria de usar a função "cosvol" no pacote "celestial" da linha de comando. Diferentemente do meu R, que está instalado no repositório do Fedora no meu sistema Linux, baixei meu pacote "celestial" em um diretório diferente na minha "casa". Cada vez que estou solicitando a função "cosvol ()", diz "não foi possível encontrar a função" cosdistCoVol "." Não sei como informar R sobre meu diretor, no qual todas as funções são baixadas no meu pacote "celestial" separadamente. Sua ajuda é apreciada.
Benjamin
Se a função estiver em uma das bibliotecas R principal / básica, pode ser necessário atualizá-la. No meu caso, eu estava tentando usar a hasNamefunção no utils. No entanto, eu estava usando o 3.3.1 e hasNamenão fui apresentado até a 3.4.0. Como você não pode atualizar utilscomo uma biblioteca autônoma, o R / R Studio disse que não tinha nenhuma biblioteca para atualizar.
MPAG
@mpag Isso ocorre porque o pacote utils é parte integrante da versão R. Se você usasse o RSiteSearch ("hasName") literalmente, a primeira entrada é uma referência ao pacote de backports que disponibilizará essa função no R 3.3.1. Consulte também github.com/r-lib/backports para obter mais informações. Eu adicionei algumas informações para esse caso, thx para notificar
Joris Meys
@JorisMeys isso é muito útil. Eu também gostaria de enviar que deveria ser uma prática padrão documentar quando uma função foi adicionada ao R na página de ajuda dessa função (por exemplo,? HasName). Por exemplo, nem https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNamenem https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmldizer "introduzido no R 3.4.0", acabei descobrindo isso navegando pelos repositórios do github e olhando blamepara utils / R / hasName.R e base / R / match.R
mpag
@mpag ou você poderia ter aberto literalmente o primeiro hit RSiteSearch("hasName")e obtido a mesma informação. Foi por isso que adicionei isso anos atrás a essa resposta. É um truque útil saber ;-)
Joris Meys
29

Outro problema, na presença de um NAMESPACE, é que você está tentando executar uma função não exportada do pacote foo .

Por exemplo (artificial, eu sei, mas):

> mod <- prcomp(USArrests, scale = TRUE)
> plot.prcomp(mod)
Error: could not find function "plot.prcomp"

Primeiramente, você não deve chamar os métodos S3 diretamente, mas vamos assumir que plot.prcompna verdade era alguma função interna útil no pacote foo . Chamar essa função se você souber o que está fazendo exige o uso de :::. Você também precisa conhecer o espaço para nome no qual a função é encontrada. Usando getAnywhere()descobrimos que a função está nas estatísticas do pacote :

> getAnywhere(plot.prcomp)
A single object matching ‘plot.prcomp’ was found
It was found in the following places
  registered S3 method for plot from namespace stats
  namespace:stats
with value

function (x, main = deparse(substitute(x)), ...) 
screeplot.default(x, main = main, ...)
<environment: namespace:stats>

Agora, podemos chamá-lo diretamente usando:

> stats:::plot.prcomp(mod)

Eu usei plot.prcompapenas como um exemplo para ilustrar o objetivo. Em uso normal, você não deve chamar métodos S3 como este. Mas, como eu disse, se a função que você deseja chamar existe (pode ser uma função de utilitário oculta, por exemplo), mas está em um namespace, R relatará que não pode encontrar a função, a menos que você diga em qual namespace procurar .

Compare isso com o seguinte: stats::plot.prcomp O exemplo acima falha porque, enquanto é statsusado plot.prcomp, não é exportado de statsacordo com o erro:

Erro: 'plot.prcomp' não é um objeto exportado de 'namespace: estatísticas'

Isso está documentado da seguinte maneira:

pkg :: name retorna o valor do nome da variável exportada no namespace pkg, enquanto pkg ::: name retorna o valor do nome da variável interna.

Gavin Simpson
fonte
1
obrigado - isso me salvou após a atualização para o R 3 para could not find function "anova.lm"... corrigida a chamada em stats:::anova.lm()vez de #
ErichBSchulz
Embora não seja tão relevante, o uso de :::foi referido como um erro de design e ::é o preferido. Não é possível encontrar facilmente a referência.
NelsonGon
1
@NelsonGon Com todo o respeito, ::e :::são diferentes e sua edição não funciona ! A plot.prcomp()função não é exportada do namespace de estatísticas, portanto, você precisa usar :::.
Gavin Simpson
@GavinSimpson Right! Peguei a palavra de R dev respeitada para o erro de design e nunca realmente o verifiquei. Talvez fosse a opinião pessoal deles.
NelsonGon
11

Normalmente, posso resolver esse problema quando um computador está sob meu controle, mas é mais um incômodo ao trabalhar com uma grade. Quando uma grade não é homogênea, nem todas as bibliotecas podem ser instaladas, e minha experiência costuma ser que um pacote não foi instalado porque uma dependência não foi instalada. Para resolver isso, verifico o seguinte:

  1. O Fortran está instalado? (Procure por 'gfortran'.) Isso afeta vários pacotes principais em R.
  2. O Java está instalado? Os caminhos da classe Java estão corretos?
  3. Verifique se o pacote foi instalado pelo administrador e disponível para uso pelo usuário apropriado. Às vezes, os usuários instalam pacotes nos locais errados ou executam sem acesso apropriado às bibliotecas corretas. .libPaths()é um bom cheque.
  4. Verifique os lddresultados para R, para ter certeza sobre as bibliotecas compartilhadas
  5. É bom executar periodicamente um script que apenas carrega todos os pacotes necessários e faz alguns testes. Isso captura o problema do pacote o mais cedo possível no fluxo de trabalho. É como criar testes ou testes de unidade, exceto que é mais como um teste de fumaça para garantir que as coisas muito básicas funcionem.
  6. Se os pacotes podem ser armazenados em um local acessível pela rede, são? Se não puderem, existe uma maneira de garantir versões consistentes nas máquinas? (Pode parecer OT, mas a instalação correta do pacote inclui a disponibilidade da versão correta .)
  7. O pacote está disponível para o sistema operacional fornecido? Infelizmente, nem todos os pacotes estão disponíveis nas plataformas. Isso volta à etapa 5. Se possível, tente encontrar uma maneira de lidar com um sistema operacional diferente, alternando para um sabor apropriado de um pacote ou desligue a dependência em certos casos.

Tendo encontrado isso um pouco, algumas dessas etapas se tornam bastante rotineiras. Embora o número 7 possa parecer um bom ponto de partida, eles estão listados na ordem aproximada da frequência em que eu os uso.

Iterador
fonte
2
Considerações úteis para ter certeza, mas mais uma resposta para "Por que recebo um erro ao instalar um pacote".
IRTFM
@ DWin: Talvez, mas não realmente. Eu posso ter sido incerto. Esses problemas surgem quando um trabalho é interrompido em uma grade porque um pacote não foi instalado. Manter a consistência do software em uma grade não é difícil, mas requer um bom processo para instalação, manutenção e depuração. Esses são apenas alguns dos itens que surgem em cada fase, pelo menos no que se refere ao som estridente que ocorre quando uma função não está disponível. :)
Iterator
6

Se isso ocorrer enquanto você verifica o seu pacote (verificação do R CMD), consulte o seu NAMESPACE.

Você pode resolver isso adicionando a seguinte declaração ao NAMESPACE:

exportPattern("^[^\\\\.]")

Isso exporta tudo o que não começa com um ponto ("."). Isso permite que você tenha suas funções ocultas, começando com um ponto:

.myHiddenFunction <- function(x) cat("my hidden function")
Jacob
fonte
Isso falha para mim no RStudio - Erro: '\.' é um escape não reconhecido na cadeia de caracteres iniciando "" ^ [^ \. "
Andrew
1
Alguma sugestão para o que eu poderia fazer se eu receber o erro ao usar um pacote que não escrevi? O pacote em si parece querer usar um método interno que não está definido porque, presumivelmente, o autor não fez o acima.
Andre Luus
4

Eu tive o erro

Erro: não foi possível encontrar a função some.function

acontecer ao fazer a verificação R CMD de um pacote que eu estava fazendo com o RStudio. Eu achei adicionando

exportPattern (".")

para o arquivo NAMESPACE fez o truque. Como nota de rodapé, eu tinha inicialmente configurado o RStudio para usar o ROxygen para fazer a documentação - e selecionei a configuração em que o ROxygen gravaria meu arquivo NAMESPACE para mim, o que continuava apagando minhas edições. Portanto, na minha instância, desmarquei NAMESPACE da configuração do Roxygen e adicionei exportPattern (".") Ao NAMESPACE para solucionar esse erro.

Swihart
fonte
1
É melhor usar o roxygen2, que reconhece as edições feitas nos arquivos do espaço para nome e as mantém intactas. Também desaconselho o uso de exportPattern (".") No arquivo de espaço para nome. Use a tag @export em seus arquivos individuais, para exportar apenas as funções que precisam ser exportadas. O Roxygen2 atualiza automaticamente o espaço para nome para exportar todas as funções que precisam ser exportadas.
Joris Meys
1
Joris - eu realmente aprecio que você reserve um tempo para comentar; Eu concordo 100% com o que você escreveu. Agora estou usando devtools / roxygen2 e estou colocando o seguinte em todas as funções que preciso exportar: # '@export
swihart
4

Este erro pode ocorrer mesmo que o nome da função seja válido se alguns argumentos obrigatórios estiverem ausentes (ou seja, você não forneceu argumentos suficientes).
Eu entendi isso em um contexto Rcpp, onde escrevi uma função C ++ com argumentos opcionais e não forneceu esses argumentos em R. Parecia que argumentos opcionais do C ++ eram vistos como obrigatórios por R. Como resultado, R não pôde encontrar uma função correspondente ao nome correto, mas um número incorreto de argumentos.

Função Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
R Chamadas:
RcppFunction(0)gera o erro
RcppFunction(0, 0)não

Matemática
fonte
2

O Rdocumentation.org possui uma função de pesquisa muito útil que, entre outras coisas, permite encontrar funções - de todos os pacotes do CRAN, bem como dos pacotes do Bioconductor e do GitHub.

insira a descrição da imagem aqui

maj
fonte
1

Se você estiver usando, parallelMapprecisará exportar funções personalizadas para os trabalhos escravos, caso contrário, você receberá um erro "não foi possível encontrar a função".

Se você definir um nível não ausente no parallelStartmesmo argumento, deve ser passado para parallelExport, caso contrário, você obterá o mesmo erro. Portanto, isso deve ser rigorosamente seguido:

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
falha catastrófica
fonte
0

Você pode corrigir esse erro espaçando o nome :: a chamada de função

comparison.cloud(colors = c("red", "green"), max.words = 100)

para

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
Tony Cronin
fonte
1
O erro diz "comparação" em vez de "comparação". Calculo que o namespace não era o problema :-)
Joris Meys
Bom ponto @Joris Meys
Tony Cronin
-1

Eu obtive o mesmo erro, estava executando a versão .99xxx, verifiquei atualizações no menu de ajuda e atualizei o My RStudio para 1.0x, e o erro não veio

Solução simples, basta atualizar o seu R Studio

Akshay Vijay Jain
fonte
1
Você poderia, por favor, explicar qual era a natureza do erro. Isso pode ajudar, mas apenas em casos muito específicos.
Joris Meys