Home > OS >  Get function arguments for function in named package
Get function arguments for function in named package

Time:11-11

I'm trying to get the arguments of a function, where the function name is stored as a string func_name. Normally I would do this as formals(func_name) and this works fine. However, I have a particular case where func_name has the package name attached as well, e.g. package::func_name.

The problem is that calling formals(package::func_name) I get:

Error in get(fun, mode = "function", envir = envir) : 
  object 'package::func_name' of mode 'function' was not found

This works if I remove the package:: bit, so the problem is clearly the presence of package::.

The reason I need to this is because the formals() command is inside a function inside an R package that I maintain, and I want to call this function from another package that I am building. Hence, I have to use the package::func_name syntax in the call.

Is there any way to somehow modify the formals() command to accept the package::func_name format? I guess I could also just remove the package:: part of the string but this seems a bit hacky. Any suggestions?

CodePudding user response:

You probably can't do it with the :: operator but you can specify the environment representing the name space of your package, e.g.:

formals('gls', envir=getNamespace('nlme'))

CodePudding user response:

Note that base::subset is R code that evaluates to the function so "base::subset" is not the name of the function; thus, evaluating it provides an easy solution (although the use of eval tends to be discouraged).

func_name <- "base::subset"
formals(eval(parse(text = func_name)))

An alternative is to pick it apart, get it and then use formals:

func_name |>
  read.table(text = _, sep = ":") |>
  with(get(V3, envir = asNamespace(V1), inherits = FALSE)) |>
  formals()
  • Related