Error: could not find function … in R
There are a few things you should check :
- Did you write the name of your function correctly? Names are case sensitive.
- Did you install the package that contains the function?
install.packages(thePackage)(this only needs to be done once)
- Did you attach that package to the workspace ?
require(thePackage)(and check its return value) or
library(thePackage)(this should be done every time you start a new R session)
- Are you using an older R version where this function didnt exist yet?
- Are you using a different version of the specific package? This could be in either direction: functions are added and removed over time, and its possible the code youre referencing is expecting a newer or older version of the package than what you have installed.
If youre not sure in which package that function is situated, you can do a few things.
- If youre sure you installed and attached/loaded the right package, type
??some.functionto get an information box that can tell you in which package it is contained.
getAnywherecan also be used to locate functions.
- If you have no clue about the package, you can use
sospackage as explained in this answer.
RSiteSearch(some.function)or searching with rdocumentation or rseek are alternative ways to find the function.
Sometimes you need to use an older version of R, but run code created for a newer version. Newly added functions (eg hasName in R 3.4.0) wont be found then. If you use an older R version and want to use a newer function, you can use the package backports to make such functions available. You also find a list of functions that need to be backported on the git repo of backports. Keep in mind that R versions older than R3.0.0 are incompatible with packages built for R3.0.0 and later versions.
Another problem, in the presence of a NAMESPACE, is that you are trying to run an unexported function from package foo.
For example (contrived, I know, but):
> mod <- prcomp(USArrests, scale = TRUE) > plot.prcomp(mod) Error: could not find function plot.prcomp
Firstly, you shouldnt be calling S3 methods directly, but lets assume
plot.prcomp was actually some useful internal function in package foo. To call such function if you know what you are doing requires the use of
:::. You also need to know the namespace in which the function is found. Using
getAnywhere() we find that the function is in package 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>
So we can now call it directly using:
plot.prcomp just as an example to illustrate the purpose. In normal use you shouldnt be calling S3 methods like this. But as I said, if the function you want to call exists (it might be a hidden utility function for example), but is in a
namespace, R will report that it cant find the function unless you tell it which namespace to look in.
Compare this to the following:
The above fails because while
plot.prcomp, it is not exported from
stats as the error rightly tells us:
Error: plot.prcomp is not an exported object from namespace:stats
This is documented as follows:
pkg::name returns the value of the exported variable name in namespace pkg, whereas pkg:::name returns the value of the internal variable name.
Error: could not find function … in R
I can usually resolve this problem when a computer is under my control, but its more of a nuisance when working with a grid. When a grid is not homogenous, not all libraries may be installed, and my experience has often been that a package wasnt installed because a dependency wasnt installed. To address this, I check the following:
- Is Fortran installed? (Look for gfortran.) This affects several major packages in R.
- Is Java installed? Are the Java class paths correct?
- Check that the package was installed by the admin and available for use by the appropriate user. Sometimes users will install packages in the wrong places or run without appropriate access to the right libraries.
.libPaths()is a good check.
lddresults for R, to be sure about shared libraries
- Its good to periodically run a script that just loads every package needed and does some little test. This catches the package issue as early as possible in the workflow. This is akin to build testing or unit testing, except its more like a smoke test to make sure that the very basic stuff works.
- If packages can be stored in a network-accessible location, are they? If they cannot, is there a way to ensure consistent versions across the machines? (This may seem OT, but correct package installation includes availability of the right version.)
- Is the package available for the given OS? Unfortunately, not all packages are available across platforms. This goes back to step 5. If possible, try to find a way to handle a different OS by switching to an appropriate flavor of a package or switch off the dependency in certain cases.
Having encountered this quite a bit, some of these steps become fairly routine. Although #7 might seem like a good starting point, these are listed in approximate order of the frequency that I use them.