[R-pkg-devel] Use of `:::` in a package for code run in a parallel cluster

Wang, Zhu w@ngz1 @end|ng |rom uth@c@@@edu
Mon Sep 14 16:30:12 CEST 2020


In mypkg, I want to call a function foo from pkg,  and foo is not exported. I thought I should use pkg:: or pkg:::, but R CMD check provided a warning.

Thanks,
Zhu

> You don't need either pkg:: or pkg::: if you are calling the function from within the package.  You may need one of those if the call is coming from a user script.

-----Original Message-----
From: Duncan Murdoch <murdoch.duncan using gmail.com> 
Sent: Monday, September 14, 2020 7:17 AM
To: Wang, Zhu <wangz1 using uthscsa.edu>; David Kepplinger <david.kepplinger using gmail.com>; R Package Devel <r-package-devel using r-project.org>
Subject: Re: [R-pkg-devel] Use of `:::` in a package for code run in a parallel cluster

On 13/09/2020 8:47 p.m., Wang, Zhu wrote:
> Apologize if I hijack this thread, but the use of ::: is something I was puzzled.
> 
> I tried Duncan's solution in my R package mypkg, something like:
> 
> pkg::callInternal("foo", args)
> 
> R CMD check mypkg
> 
> * checking dependencies in R code ... WARNING '::' or ':::' import not 
> declared from: ‘pkg'
> 
> I probably missed something here.

You don't need either pkg:: or pkg::: if you are calling the function from within the package.  You may need one of those if the call is coming from a user script.

If you use pkg:: from mypkg, you need to declare that mypkg Imports pkg. 
  (This is a line in its DESCRIPTION file.)  I think that's what the WARNING is telling you.

Duncan Murdoch

> 
> Thanks,
> Zhu
> 
> -----Original Message-----
> From: R-package-devel <r-package-devel-bounces using r-project.org> On 
> Behalf Of Duncan Murdoch
> Sent: Sunday, September 13, 2020 3:20 PM
> To: David Kepplinger <david.kepplinger using gmail.com>; R Package Devel 
> <r-package-devel using r-project.org>
> Subject: Re: [R-pkg-devel] Use of `:::` in a package for code run in a 
> parallel cluster
> 
> On 13/09/2020 3:51 p.m., David Kepplinger wrote:
>> Dear list members,
>>
>> I submitted an update for my package and got automatically rejected 
>> by the incoming checks (as expected from my own checks) for using 
>> `:::` calls to access the package's namespace.
>> "There are ::: calls to the package's namespace in its code. A 
>> package
>> *almost* never needs to use ::: for its own objects:…" (emphasis 
>> mine)
>>
>> This was a conscious decision on my part as the package runs code on 
>> a user-supplied parallel cluster and I consider cluster-exporting the 
>> required functions a no-go as it would potentially overwrite objects 
>> in the clusters R sessions. The package code does not own the cluster 
>> and hence the R sessions. Therefore overwriting objects could 
>> potentially lead to unintended behaviour which is opaque to the user and difficult to debug.
>>
>> Another solution to circumvent the R CMD check note is to export the 
>> functions to the public namespace but mark them as internal. This was 
>> also suggested in another thread on this mailing list (c.f. 
>> "Etiquette for package submissions that do not automatically pass 
>> checks?"). I do not agree with this work-around as the methods are 
>> indeed internal and should never be used by users. Exporting truly 
>> internal functions for the sake of satisfying R CMD check is a bad 
>> argument, in particular if there is a clean, well-documented, 
>> solution by using `:::`
> 
> Who is calling this function:  package code or user code?  I assume 
> it's a bit of a mix:  your package writes a script that calls the 
> function when it runs in user space.  (It would help if you gave an 
> explicit example of when you need to use this technique.)
> 
> If my assumption is correct, there are other simple workarounds 
> besides exporting the functions.  Instead of putting
> 
>      pkg:::foo(args)
> 
> into your script, put
> 
>      pkg::callInternal("foo", args)
> 
> where pkg::callInternal is an exported function that can look up unexported functions in the namespace.
> 
> You may argue that you prefer pkg:::foo for some reason:  to which I'd respond that you are being rude to the CRAN volunteers.  I've offered two options (one in the previous thread, a different one here), and there was a third one in that thread offered by Ivan Krylov.  Surely one of these is good enough for your needs, and you shouldn't force CRAN to handle you specially.
> 
> Duncan
> 
>>
>> I argue `:::` is the only clean solution to this problem and no dirty 
>> work-arounds are necessary. This is a prime example of where `:::` is 
>> actually useful and needed inside a package. If the R community 
>> disagrees, I think R CMD check should at least emit a WARNING instead 
>> of a NOTE and elaborate on the problem and accepted work-arounds in 
>> "Writing R extensions". Or keep emitting a NOTE but listing those 
>> nebulous reasons where `:::` would be tolerated inside a package.
>> Having more transparent criteria for submitting to CRAN would be 
>> really helpful to the entire R community and probably also reduce the traffic on this mailing list.
>>
>> Best,
>> David
>>
>> 	[[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-package-devel using r-project.org mailing list 
>> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>>
> 
> ______________________________________________
> R-package-devel using r-project.org mailing list 
> https://stat.ethz.ch/mailman/listinfo/r-package-devel
> 



More information about the R-package-devel mailing list