Hello all, I don't know if it is possible, but I would like to use do.call in C code in my package. The function do.call is defined as> do.callfunction (what, args, quote = FALSE, envir = parent.frame()) { if (!is.list(args)) stop("second argument must be a list") if (quote) { enquote <- function(x) as.call(list(as.name("quote"), x)) args <- lapply(args, enquote) } .Internal(do.call(what, args, envir)) } <environment: namespace:base>>In <src>/main/names.c, the function do.call is linked to the C function do_docall (line 499). (.Internal calls the good function line 1194.) And the do_docall function is defined in <src>/main/coerce.c line 2217 and declared as SEXP attribute_hidden do_docall(SEXP call, SEXP op, SEXP args, SEXP rho) in Internal.h. The problem is that I do not guess the exact meaning of theses arguments, and the header file Internal.h is not found when included in my C file. As this header is not listed in R-exts.pdf section 6.17, I think I cannot use the do_docall function. Does anyone face this problem? or have an idea on how to solve it? Thanks in advance Christophe -- Christophe DUTANG Ph. D. student at ISFA, Lyon, France [[alternative HTML version deleted]]
On Tue, 2010-11-02 at 11:28 -0400, Christophe Dutang wrote:> Hello all, > > I don't know if it is possible, but I would like to use do.call in C code in > my package. The function do.call is defined as > > do.call > function (what, args, quote = FALSE, envir = parent.frame()) > { > if (!is.list(args)) > stop("second argument must be a list") > if (quote) { > enquote <- function(x) as.call(list(as.name("quote"), > x)) > args <- lapply(args, enquote) > } > .Internal(do.call(what, args, envir)) > } > <environment: namespace:base> > > > > In <src>/main/names.c, the function do.call is linked to the C function > do_docall (line 499). (.Internal calls the good function line 1194.) > > And the do_docall function is defined in <src>/main/coerce.c line 2217 and > declared as > SEXP attribute_hidden do_docall(SEXP call, SEXP op, SEXP args, SEXP rho) > in Internal.h.The 'attribute_hidden' declaration indicates do_docall was not intended for use by package developers. That's also why it's not part of the installed headers. See 'Writing R Extensions', the section titled 'Controlling Visibility'.> The problem is that I do not guess the exact meaning of theses arguments, > and the header file Internal.h is not found when included in my C file.I'm not sure there are any biolerplate descriptions of this common prototype. The are some hints in "R Internals" chapter 2 and the source file /src/main/names.c.> As this header is not listed in R-exts.pdf section 6.17, I think I cannot > use the do_docall function. > > Does anyone face this problem? or have an idea on how to solve it?Some ideas, in good-to-bad order: 1. look for a solution not involving do.call 2. modularize your C code, such that do.call may be used at R level 3. use call() at R level, pass result + envir to C code for later eval() 4. emulate do_docall in custom C code> Thanks in advance > > > Christophe > > >-- Matthew S. Shotwell Graduate Student Division of Biostatistics and Epidemiology Medical University of South Carolina
On 02/11/2010 11:28 AM, Christophe Dutang wrote:> Hello all, > > I don't know if it is possible, but I would like to use do.call in C code in > my package. The function do.call is defined as > > do.call > function (what, args, quote = FALSE, envir = parent.frame()) > { > if (!is.list(args)) > stop("second argument must be a list") > if (quote) { > enquote<- function(x) as.call(list(as.name("quote"), > x)) > args<- lapply(args, enquote) > } > .Internal(do.call(what, args, envir)) > } > <environment: namespace:base> > > > > In<src>/main/names.c, the function do.call is linked to the C function > do_docall (line 499). (.Internal calls the good function line 1194.) > > And the do_docall function is defined in<src>/main/coerce.c line 2217 and > declared as > SEXP attribute_hidden do_docall(SEXP call, SEXP op, SEXP args, SEXP rho) > in Internal.h. > > The problem is that I do not guess the exact meaning of theses arguments, > and the header file Internal.h is not found when included in my C file. > > As this header is not listed in R-exts.pdf section 6.17, I think I cannot > use the do_docall function. > > Does anyone face this problem? or have an idea on how to solve it?You would rarely want to use do.call from C. You should use eval(). See the examples in the Writing R Extensions manual, in the section "Evaluating R expressions from C". Duncan Murdoch