[R] Antwort: Re: Visibility of libraries called from within functions
G.Maubach at weinwolf.de
G.Maubach at weinwolf.de
Thu Oct 13 12:21:42 CEST 2016
Hi Duncan,
many thanks for your reply.
Your suggestion of using requireNamespace() together with explicit
namespace calling using the "::" operator is what I was looking for:
-- cut --
f_test <- function() {
requireNamespace("openxlsx")
cat("Loaded packages AFTER loading library")
print(search())
xlsx::read.xlsx(file = "c:/temp/test.xlsx",
sheetName = "test")
}
cat("Loaded packages BEFORE function call ----------------------------")
search()
f_test()
cat("Loaded packages AFTER function call -----------------------------")
search()
-- cut --
When reading ?requireNamespace I did not really get how R operates behind
the scenes.
Using "library" attaches the namespace to the search path. Using
"requireNamespace" does not do that.
But how does R find the namespace then? What kind of list or directory
used R to to store the namespace and lookup the correct function or
methods of this namespace?
Kind regards
Georg
Von: Duncan Murdoch <murdoch.duncan at gmail.com>
An: G.Maubach at weinwolf.de, r-help at r-project.org,
Datum: 13.10.2016 10:43
Betreff: Re: [R] Visibility of libraries called from within
functions
On 13/10/2016 4:18 AM, G.Maubach at weinwolf.de wrote:
> Hi All,
>
> in my R programs I use different libraries to work with Excel sheets, i.
> e. xlsx, excel.link.
>
> When running chunks of code repeatedly and not always in the order the
> program should run for development purposes I ran into trouble. There
were
> conflicts between the methods within these functions causing R to crash.
>
> I thought about defining functions for the different task and calling
the
> libraries locally to there functions. Doing this test
>
> -- cut --
>
> f_test <- function() {
> library(xlsx)
> cat("Loaded packages AFTER loading library")
> print(search())
> }
>
> cat("Loaded packages BEFORE function call ----------------------------")
> search()
>
> f_test()
>
> cat("Loaded packages AFTER function call -----------------------------")
> search()
>
> -- cut --
>
> showed that the library "xlsx" was loaded into the global environment
and
> stayed there although I had expected R to unload the library when
leaving
> the function. Thus confilics can occur more often.
>
> I had a look into ?library and saw that there is no argument telling R
to
> hold the library in the calling environment.
>
> How can I load libraries locally to the calling functions?
You can detach at the end of your function, but that's tricky to get
right: the package might have been on the search list before your
function was called. It's better not to touch the search list at all.
The best solution is to use :: notation to get functions without putting
them on the search list. For example, use
xlsx::write.xlsx(data, file)
If you are not sure if your user has xlsx installed, you can use
requireNamespace() to check.
Duncan Murdoch
More information about the R-help
mailing list