[R-pkg-devel] NOTE about use of `:::`

Andrew Simmons @kw@|mmo @end|ng |rom gm@||@com
Thu Dec 15 03:06:31 CET 2022


Here's another suggestion, not sure if it's any good, but you could
structure your functions like

parse_args <- function (envir = parent.frame())
{
    evalq(list(a = a, b = b, ..., y = y, z = z), envir)
    <...>
}

exported_fun <- function (a, b, ..., y, z)
{
    parse_args()
    <...>
}

It's seriously ugly, but it could work. You could also do some bquote
substitution

parse_args_expr <- quote(parse_args(a = a, b = b, ..., y = y, z = z))

exported_fun <- function (a, b, ..., y, z) NULL
body(exported_fun) <- bquote({
   .(parse_args_expr)
    <...>
})

On Wed, Dec 14, 2022, 20:36 David Kepplinger <david.kepplinger using gmail.com>
wrote:

> Thank you both for the suggestions. I would prefer a clean stack trace in
> case of errors as input errors are caught by this function and hence users
> might very well see errors emitted from it. It seems more informative to me
> if the error message would say "Error in .parse_args…" than "Error in
> new.env(…". But since this solution was suggested by both of you it is
> likely that CRAN too would demand this or a similar approach instead of
> using `:::`. I know `:::` is expansive, but the computations that follow
> are typically at least a few minutes so anything that takes less than a few
> seconds won't be noticeable.
>
> I also thought about using `...` before, but then the signature of the
> user-facing functions would be incomplete and IDEs won't be able to provide
> suggestions.
>
> Thanks for the help!
>
> -- David
>
> On Wed, Dec 14, 2022 at 7:11 PM Simon Urbanek <simon.urbanek using r-project.org
> >
> wrote:
>
> > David,
> >
> > why not
> >
> > call[[1]] <- parse_args
> >
> > The assignment is evaluated in your namespace so that makes sure the call
> > is that of your function. The only downside I see is that in a stack
> trace
> > you'll see the definition instead of the name.
> > Or possibly
> >
> > do.call(parse_args, as.list(call[-1]))
> >
> > Cheers,
> > Simon
> >
> > PS: Note that ::: is expensive - it probably doesn't matter here, but
> > would in repeatedly called functions.
> >
> >
> > > On 15/12/2022, at 12:19 PM, David Kepplinger <
> david.kepplinger using gmail.com>
> > wrote:
> > >
> > > Dear List,
> > >
> > > I am working on updating the pense package and refactored some of the
> > > methods. I have several functions which take the same arguments, hence
> > I'm
> > > sending all these arguments to an internal function, called
> > `parse_args()`.
> > > Since I want to evaluate the arguments in the caller's environment, I'm
> > > using the following code
> > >
> > >  call <- match.call(expand.dots = TRUE)
> > >  call[[1]] <- quote(pense:::parse_args)
> > >  args <- eval.parent(call)
> > >
> > > Of course, R CMD CHECK complains about the use of `:::`, as it's almost
> > > never needed. I think the above usage would fall into that area of
> > > "almost", but I'm not sure if (a) there's a better approach and (b) the
> > > CRAN team would agree with me. I would have to test (b) by submitting
> and
> > > working with the CRAN team, but I wanted to ask the list first to see
> if
> > > I'm missing something obvious. I don't want to export the function
> > > parse_args() as it's not useful for a user, and the use is truly
> > internal.
> > >
> > > Thanks and all the best,
> > > David
> > >
> > >       [[alternative HTML version deleted]]
> > >
> > > ______________________________________________
> > > R-package-devel using r-project.org mailing list
> > > https://stat.ethz.ch/mailman/listinfo/r-package-devel
> > >
> >
> >
>
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> R-package-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-package-devel
>

	[[alternative HTML version deleted]]



More information about the R-package-devel mailing list