I think the best answer is to quote from r-pkgs:
Let’s make this crystal clear:
Listing a package in
DESCRIPTION does not “import” that package.
It is natural to assume that listing a package in
Imports actually “imports” the package, but this is just an unfortunate choice of name for the
Imports field. The
Imports field makes sure that the packages listed there are installed when your package is installed. It does not make those functions available to you, e.g. below
R/, or to your user.
It is neither automatic nor necessarily advisable that a package listed in
Imports also appears in
importFrom(). It is common for a package to be listed in
DESCRIPTION, but not in
NAMESPACE. The converse is not true. Every package mentioned in
NAMESPACE must also be present in the
DESCRIPTION listing is about what's needed to use your package, and will be used by R to find dependencies during installation; the
NAMESPACE listing is about finding functions in the dependencies when your package is loaded/used.
And in case it's not clear:
@importFrom actually has nothing to do with
DESCRIPTION, it's an instruction to Roxygen to automatically add this function to
NAMESPACE. To add to
DESCRIPTION, the "Posit-endorsed" way is with