Error: no se pudo encontrar la función ... en R

177

Esta es una pregunta frecuente, por lo que debe ser lo más completa posible. La respuesta es una respuesta de la comunidad, así que siéntase libre de editar si cree que falta algo.

Esta pregunta fue discutida y aprobada en meta.

Estoy usando R y lo intenté, some.functionpero recibí el siguiente mensaje de error:

Error: could not find function "some.function"

Esta pregunta surge con mucha frecuencia. Cuando obtienes este tipo de error en R, ¿cómo puedes resolverlo?

Joris Meys
fuente
55
Antes de votar para cerrar esta pregunta, primero lea esta discusión en meta: meta.stackexchange.com/questions/101892/…
Andrie
2
Si todo lo demás falla, intente grepping el código fuente para la base R y sus paquetes instalados
nullglob
3
@nullglob Eso parece algo extremo :-)
Gavin Simpson
Tengo una pregunta relevante: stackoverflow.com/questions/23357551/… . En este caso, CUALQUIER Rcomando falla, pero q()! ¡Los consejos serán muy apreciados!
Aleksandr Blekh
Tal vez sea tonto, pero tenga cuidado de no nombrar la salida de la función como la función misma. [Aprendido por experiencia ...]
user3507584

Respuestas:

126

Hay algunas cosas que debe verificar:

  1. ¿Escribiste el nombre de tu función correctamente? Los nombres distinguen entre mayúsculas y minúsculas.
  2. ¿Instaló el paquete que contiene la función? install.packages("thePackage")(esto solo debe hacerse una vez)
  3. ¿Adjuntó ese paquete al espacio de trabajo? require(thePackage)o library(thePackage)(esto debe hacerse cada vez que inicie una nueva sesión de R)
  4. ¿Está utilizando una versión R anterior donde esta función aún no existía?

Si no está seguro en qué paquete se encuentra esa función, puede hacer algunas cosas.

  1. Si está seguro de que instaló y adjuntó / cargó el paquete correcto, escriba help.search("some.function")u ??some.functionpara obtener un cuadro de información que pueda indicarle en qué paquete está contenido.
  2. findy getAnywheretambién se puede usar para localizar funciones.
  3. Si usted no tiene ninguna pista sobre el paquete, se puede utilizar findFnen el sospaquete como se explica en esta respuesta .
  4. RSiteSearch("some.function")o buscar con rdocumentation o rseek son formas alternativas de encontrar la función.

A veces necesita usar una versión anterior de R, pero ejecutar código creado para una versión más nueva. Las funciones recién agregadas (por ejemplo, hasName en R 3.4.0) no se encontrarán entonces. Si usa una versión R anterior y desea usar una función más nueva, puede usar los backports del paquete para que tales funciones estén disponibles. También encontrará una lista de funciones que deben ser retroportadas en el repositorio git de backports . Tenga en cuenta que las versiones R anteriores a R3.0.0 son incompatibles con los paquetes creados para R3.0.0 y versiones posteriores.

Joris Meys
fuente
Hola Joris, tengo una pregunta rápida. Soy nuevo en R pero pude instalarlo con éxito. Me gustaría usar la función "cosvol" en el paquete "celestial" desde la línea de comandos. A diferencia de mi R que está instalada desde el repositorio de Fedora en mi sistema Linux, he descargado mi paquete "celestial" en un directorio diferente en mi "casa". Cada vez que solicito la función "cosvol ()", dice, "no se pudo encontrar la función" cosdistCoVol "." No estoy seguro de cómo hacerle saber a R sobre mi director en el que todas las funciones se descargan en mi paquete "celestial" por separado. Tu ayuda es apreciada.
Benjamin
Si la función se encuentra en una de las bibliotecas de núcleo / base R, es posible que deba actualizarla. En mi caso, estaba tratando de usar la hasNamefunción en utils. Sin embargo, estaba usando 3.3.1 y hasNameno me presentaron hasta 3.4.0. Como no puede actualizar utilscomo una biblioteca independiente, R / R Studio dijo que no tenía ninguna biblioteca para actualizar.
mpag
@mpag Eso se debe a que el paquete de utilidades es parte integral de la versión R. Si usaría RSiteSearch ("hasName") literalmente, la primera entrada es una referencia al paquete de backports que hará que esa función esté disponible en R 3.3.1. Consulte también github.com/r-lib/backports para obtener más información. He agregado información para ese caso, gracias por notificar
Joris Meys,
@JorisMeys eso es muy útil. También me gustaría presentar que debería ser una práctica estándar documentar cuando una función se ha agregado a R en la página de ayuda de esa función (por ejemplo,? HasName). Por ejemplo, https://www.rdocumentation.org/packages/utils/versions/3.4.3/topics/hasNameni https://stat.ethz.ch/R-manual/R-devel/library/utils/html/hasName.htmldigas "introducido en R 3.4.0". Terminé descubriéndolo navegando por los repositorios de github y mirando blameutils / R / hasName.R y base / R / match.R
mpag
@mpag o podrías haber abierto literalmente el primer hit RSiteSearch("hasName")y obtener la misma información. Es por eso que agregué esto hace años a esa respuesta. Es un truco útil para saber ;-)
Joris Meys
29

Otro problema, en presencia de un NAMESPACE, es que está intentando ejecutar una función no exportada desde el paquete foo .

Por ejemplo (artificial, lo sé, pero):

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

En primer lugar, no debería llamar a los métodos S3 directamente, pero supongamos que en plot.prcomprealidad era una función interna útil en el paquete foo . Llamar a dicha función si sabe lo que está haciendo requiere el uso de :::. También necesita saber el espacio de nombres en el que se encuentra la función. Usando getAnywhere()encontramos que la función está en las estadísticas del paquete :

> 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>

Entonces ahora podemos llamarlo directamente usando:

> stats:::plot.prcomp(mod)

Lo he usado plot.prcompsolo como ejemplo para ilustrar el propósito. En uso normal, no debería llamar a métodos S3 como este. Pero como dije, si la función a la que desea llamar existe (podría ser una función de utilidad oculta, por ejemplo), pero está en una namespace, R informará que no puede encontrar la función a menos que le indique en qué espacio de nombres buscar .

Compare esto con lo siguiente: stats::plot.prcomp Lo anterior falla porque, mientras lo statsusa plot.prcomp, no se exporta statscomo el error nos dice correctamente:

Error: 'plot.prcomp' no es un objeto exportado de 'namespace: stats'

Esto se documenta de la siguiente manera:

pkg :: name devuelve el valor del nombre de la variable exportada en el espacio de nombres pkg, mientras que pkg ::: name devuelve el valor del nombre de la variable interna.

Gavin Simpson
fuente
1
gracias - esto me salvó después de actualizar a R 3 para could not find function "anova.lm"... arreglado con llamadas en su stats:::anova.lm()lugar
ErichBSchulz
Si bien no es tan relevante, el uso de :::ha sido referido como un error de diseño y eso ::es preferible. No se puede encontrar fácilmente la referencia.
NelsonGon
1
@NelsonGon Con el debido respeto, ::y :::son diferentes y su edición no funciona . La plot.prcomp()función no se exporta desde el espacio de nombres de estadísticas, por lo que debe usarla :::.
Gavin Simpson,
@GavinSimpson ¡Correcto! Tomé una palabra respetada de R dev para el error de diseño y nunca lo había verificado realmente. Quizás, era su opinión personal.
NelsonGon
11

Por lo general, puedo resolver este problema cuando una computadora está bajo mi control, pero es más molesto cuando trabajo con una cuadrícula. Cuando una cuadrícula no es homogénea, no todas las bibliotecas pueden instalarse, y mi experiencia a menudo ha sido que no se instaló un paquete porque no se instaló una dependencia. Para abordar esto, verifico lo siguiente:

  1. ¿Está instalado Fortran? (Busque 'gfortran'.) Esto afecta a varios paquetes importantes en R.
  2. ¿Está instalado Java? ¿Son correctas las rutas de clases de Java?
  3. Verifique que el paquete haya sido instalado por el administrador y esté disponible para el uso del usuario apropiado. En ocasiones, los usuarios instalarán paquetes en lugares incorrectos o se ejecutarán sin el acceso adecuado a las bibliotecas correctas. .libPaths()Es un buen cheque.
  4. Verifique los lddresultados para R, para asegurarse de las bibliotecas compartidas
  5. Es bueno ejecutar periódicamente un script que solo carga todos los paquetes necesarios y realiza algunas pequeñas pruebas. Esto detecta el problema del paquete lo antes posible en el flujo de trabajo. Esto es similar a las pruebas de construcción o pruebas unitarias, excepto que es más como una prueba de humo para asegurarse de que las cosas básicas funcionen.
  6. Si los paquetes se pueden almacenar en una ubicación accesible en la red, ¿lo son? Si no pueden, ¿hay alguna manera de garantizar versiones consistentes en todas las máquinas? (Esto puede parecer OT, pero la instalación correcta del paquete incluye la disponibilidad de la versión correcta ).
  7. ¿El paquete está disponible para el sistema operativo dado? Desafortunadamente, no todos los paquetes están disponibles en todas las plataformas. Esto vuelve al paso 5. Si es posible, intente encontrar una manera de manejar un sistema operativo diferente cambiando a un sabor apropiado de un paquete o apague la dependencia en ciertos casos.

Habiendo encontrado esto bastante, algunos de estos pasos se vuelven bastante rutinarios. Aunque el # 7 puede parecer un buen punto de partida, estos se enumeran en orden aproximado de la frecuencia con la que los uso.

Iterador
fuente
2
Consideraciones útiles para estar seguro, pero más una respuesta para "¿Por qué recibo un error al instalar un paquete?".
IRTFM
@DWin: Quizás, pero no realmente. Puede que no haya sido claro. Estos problemas surgen cuando un trabajo se detiene en una cuadrícula porque no se instaló un paquete. Mantener la coherencia del software en una cuadrícula no es difícil, pero requiere un buen proceso para la instalación, el mantenimiento y la depuración. Estos son solo algunos de los elementos que surgen de cada fase, al menos en lo que se refiere al sonido chirriante que se produce cuando una función no está disponible. :)
Iterator
6

Si esto ocurre mientras revisa su paquete (R CMD check), eche un vistazo a su NAMESPACE.

Puede resolver esto agregando la siguiente declaración al NAMESPACE:

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

Esto exporta todo lo que no comienza con un punto ("."). Esto le permite tener sus funciones ocultas, comenzando con un punto:

.myHiddenFunction <- function(x) cat("my hidden function")
Jacob
fuente
Esto me falla en RStudio - Error: '\.' es un escape no reconocido en la cadena de caracteres que comienza "" ^ [^ \. "
Andrew
1
¿Alguna sugerencia de lo que podría hacer si recibo el error mientras uso un paquete que no escribí? El paquete en sí parece querer usar un método interno que no está definido porque presumiblemente el autor no hizo lo anterior.
Andre Luus
4

Tuve el error

Error: no se pudo encontrar la función some.function

sucede al hacer la verificación R CMD de un paquete que estaba haciendo con RStudio. Encontré agregar

exportPattern (".")

al archivo NAMESPACE hizo el truco. Como nota al margen, inicialmente configuré RStudio para usar ROxygen para hacer la documentación, y seleccioné la configuración donde ROxygen escribiría mi archivo NAMESPACE para mí, lo que borraba mis ediciones. Entonces, en mi caso, desmarqué NAMESPACE de la configuración de Roxygen y agregué exportPattern (".") A NAMESPACE para resolver este error.

swihart
fuente
1
Es mejor que use roxygen2, que reconoce las ediciones que realiza en los archivos de espacio de nombres y las mantiene intactas. También recomendaría encarecidamente no usar exportPattern (".") En el archivo de espacio de nombres. Use la etiqueta @export en su lugar en sus archivos individuales, de modo que solo exporte las funciones que necesitan exportarse. Roxygen2 actualizará automáticamente el espacio de nombres para exportar todas las funciones que necesitan exportarse.
Joris Meys
1
Joris: realmente aprecio que te hayas tomado el tiempo para comentar; Estoy 100% de acuerdo con lo que escribiste. Ahora estoy usando devtools / roxygen2 y estoy poniendo lo siguiente en todas las funciones que necesito exportar: # '@export
swihart
4

Este error puede ocurrir incluso si el nombre de la función es válido si faltan algunos argumentos obligatorios (es decir, no proporcionó suficientes argumentos).
Obtuve esto en un contexto de Rcpp, donde escribí una función de C ++ con argumentos opcionales, y no proporcioné esos argumentos en R. Parecía que R. consideraba que los argumentos opcionales del C ++ eran obligatorios. Como resultado, R no pudo encontrar una función coincidente para el nombre correcto pero un número incorrecto de argumentos.

Función Rcpp: SEXP RcppFunction(arg1, arg2=0) {}
Llamadas R:
RcppFunction(0)plantea el error
RcppFunction(0, 0)no

Matemáticas
fuente
2

Rdocumentation.org tiene una función de búsqueda muy útil que, entre otras cosas, le permite encontrar funciones, de todos los paquetes en CRAN, así como de paquetes de Bioconductor y GitHub.

ingrese la descripción de la imagen aquí

comandante
fuente
1

Si está utilizando parallelMap, necesitará exportar funciones personalizadas a los trabajos esclavos, de lo contrario obtendrá un error "no se pudo encontrar la función".

Si establece un nivel no perdido en parallelStartel mismo argumento, debe pasarlo parallelExport, de lo contrario, obtendrá el mismo error. Entonces esto debe seguirse estrictamente:

parallelStart(mode = "<your mode here>", N, level = "<task.level>")
parallelExport("<myfun>", level = "<task.level>")
Fallo catastrófico
fuente
0

Es posible que pueda corregir este error por espaciado de nombre :: la llamada de función

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

a

wordcloud::comparison.cloud(colors = c("red", "green"), max.words = 100)
Tony Cronin
fuente
1
El error dice "comparación" en lugar de "comparación". Creo que el espacio de nombres no fue el problema :-)
Joris Meys
Buen lugar @Joris Meys
Tony Cronin
-1

Obtuve el mismo error, estaba ejecutando la versión .99xxx, busqué actualizaciones desde el menú de ayuda y actualicé My RStudio a 1.0x, luego el error no llegó

Solución tan simple, solo actualice su R Studio

Akshay Vijay Jain
fuente
1
¿Podría por favor explicar cuál fue la naturaleza del error? Esto podría ayudar, pero solo en casos muy específicos.
Joris Meys