Error: no se pudo encontrar la función... en R
Esta es una pregunta frecuente, así que sea lo más completa posible. La respuesta es una respuesta de la comunidad, así que no dudes en editarla si crees que falta algo.
Esta pregunta fue discutida y aprobada en meta.
Estoy usando R y lo intenté some.function
pero 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 solucionarlo?
Hay algunas cosas que debes verificar:
- ¿Escribiste correctamente el nombre de tu función? Los nombres distinguen entre mayúsculas y minúsculas.
- ¿Instalaste el paquete que contiene la función?
install.packages("thePackage")
(esto sólo debe hacerse una vez) - ¿Adjuntó ese paquete al espacio de trabajo?
require(thePackage)
(y verifique su valor de retorno) olibrary(thePackage)
(esto debe hacerse cada vez que inicie una nueva sesión de R) - ¿Está utilizando una versión anterior de R en la que esta función aún no existía?
- ¿ Está utilizando una versión diferente del paquete específico ? Esto podría ser en cualquier dirección: las funciones se agregan y eliminan con el tiempo, y es posible que el código al que hace referencia espere una versión del paquete más nueva o más antigua que la que ha instalado.
Si no está seguro de en qué paquete se encuentra esa función, puede hacer algunas cosas.
- Si está seguro de haber instalado y adjuntado/cargado el paquete correcto, escriba
help.search("some.function")
o??some.function
para obtener un cuadro de información que le indique en qué paquete está contenido. find
ygetAnywhere
también se puede utilizar para localizar funciones.- Si no tiene idea sobre el paquete, puede usarlo
findFn
en elsos
paquete como se explica en esta respuesta . RSiteSearch("some.function")
o buscar con rdocumentation o rseek son formas alternativas de encontrar la función.
A veces es necesario utilizar una versión anterior de R, pero ejecutar el 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 en ese momento. Si usa una versión anterior de R y desea usar una función más nueva, puede usar los backports del paquete para que dichas funciones estén disponibles. También encontrará una lista de funciones que deben respaldarse en el repositorio git de backports . Tenga en cuenta que las versiones de R anteriores a R3.0.0 son incompatibles con los paquetes creados para R3.0.0 y versiones posteriores.
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 plot.prcomp
en realidad hay alguna función interna útil en el paquete foo . Para llamar a dicha función si sabes lo que estás 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 el paquete stats :
> 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.prcomp
solo como ejemplo para ilustrar el propósito. En uso normal no deberías llamar a métodos S3 como este. Pero como dije, si la función que desea llamar existe (podría ser una función de utilidad oculta, por ejemplo), pero está en un 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 while stats
uses plot.prcomp
, no se exporta stats
como nos dice correctamente el error:
Error: 'plot.prcomp' no es un objeto exportado desde 'namespace:stats'
Esto está documentado 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.
Generalmente puedo resolver este problema cuando tengo una computadora bajo mi control, pero es más molesto cuando trabajo con una cuadrícula. Cuando un grid no es homogéneo, es posible que no se instalen todas las bibliotecas y, a menudo, mi experiencia ha sido que no se instaló un paquete porque no se instaló una dependencia. Para solucionar esto, verifico lo siguiente:
- ¿Está instalado Fortran? (Busque 'gfortran'). Esto afecta a varios paquetes importantes en R.
- ¿Está instalado Java? ¿Son correctas las rutas de clases de Java?
- Compruebe que el paquete haya sido instalado por el administrador y esté disponible para que lo utilice el usuario adecuado. A veces, los usuarios instalan paquetes en lugares equivocados o los ejecutan sin el acceso adecuado a las bibliotecas adecuadas.
.libPaths()
es un buen cheque. - Verifique
ldd
los resultados de R, para estar seguro acerca de las bibliotecas compartidas - Es bueno ejecutar periódicamente un script que simplemente cargue todos los paquetes necesarios y realice 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 compilación o las pruebas unitarias, excepto que es más como una prueba de humo para asegurarse de que las cosas más básicas funcionen.
- Si los paquetes se pueden almacenar en una ubicación accesible a 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 ).
- ¿El paquete está disponible para el sistema operativo determinado? Lamentablemente, no todos los paquetes están disponibles en todas las plataformas. Esto regresa al paso 5. Si es posible, intente encontrar una manera de manejar un sistema operativo diferente cambiando a un tipo apropiado de paquete o desactivando la dependencia en ciertos casos.
Habiendo encontrado esto bastante, algunos de estos pasos se vuelven bastante rutinarios. Aunque el número 7 puede parecer un buen punto de partida, se enumeran en orden aproximado según la frecuencia con la que los uso.
Si esto ocurre mientras revisa su paquete (verificación R CMD), eche un vistazo a su ESPACIO DE NOMBRES.
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")
tuve el error
Error: no se pudo encontrar la función
some.function
Esto sucede al realizar la verificación R CMD de un paquete que estaba creando con RStudio. encontré agregando
patrón de exportación(".")
al archivo NAMESPACE funcionó. Como nota al margen, inicialmente configuré RStudio para usar ROxygen para crear la documentación, y seleccioné la configuración donde ROxygen escribiría mi archivo NAMESPACE por mí, lo que seguía borrando mis ediciones. Entonces, en mi caso, desmarqué NAMESPACE de la configuración de Roxygen y agregué exportPattern(".") a NAMESPACE para resolver este error.
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 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 de 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)
genera el error
RcppFunction(0, 0)
, no