[R] Visibility of libraries called from within functions
Duncan Murdoch
murdoch.duncan at gmail.com
Thu Oct 13 10:43:40 CEST 2016
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