I have always assumed that having a package in the 'Depends' field would automatically also import the namespace. However, it seems that in R 2.15, dependencies do not become available until the package is actually attached to the searchpath. Is this intended behavior?
The problem appears as follows: Suppose there is a package 'Child' which Depends, but does not explicitly Import a package called 'Parent' and contains a function that calls out to an object in the namespace of 'Parent'. Then when this function is called without actually attaching 'Child', the function in 'Parent' cannot be found.
Here an example from the manual of the bigdata
package, but the problem is very widespread:
x = matrix(rnorm(50*80),50,80)
beta = c(3,2,1.5,rep(0,77))
y = rnorm(50) + x%*%beta
z1 = bigdata::lasso.stars(x,y)
The example fails because lasso.stars depends on 'glmnet' which is not loaded until bigdata
is attached. The only way to be able to call lasso.stars
is to actually attach the bigdata
package:
library(bigdata)
z1 = bigdata::lasso.stars(x,y)
Now to further complicate things, it seems that this problem is inherited to any 'grandchild' package that Imports in this case the lasso.stars function. I have a hard time finding a good example but I am sure they are out there.
Is this a bug? I know that it can be avoided by asking package authors to use Imports instead of Depends, but in practice the majority of the packages on CRAN still use Depends. It seems like the problem is easily avoided if R would automatically import the namespace of any Depends packages into to the child package namespace.
library(xts)
, then the export functions ofzoo
is automatically loaded. – Edinaxts
package has a NAMESPACE file in which it manually imports required functions formzoo
. Therefore it doesn't have the problem I think. – Vannoyrandom
package? But I cannot find the depends ofbigdata
in therandom
package. – Edinalibrary(bigdata)
? Is there any reason? – Edinalasso.stars()
from thebigdata
package, you can't get away with doing that via anImports
directive. If you just putimport(bigdata)
in the NAMESPACE file, the package will findlasso.stars()
, but won't be able to use it, because it won't findglmnet()
from theglmnet
package. So, as a package writer, you are forced to instead useDepends: bigdata
(which causes bothbigdata
andglmnet
to be attached to the search path). – Encephaloma