Kelly Thompson
2022-Mar-12 21:29 UTC
[R] obtain names & values of all arguments passed to a function including args passed using the "three dots" ellipsis ( ...) parameter, for use in do.call
#What are "good" ways to obtain all arguments passed to or being used by a function, including arguments passed to the function using the "three dots" ellipsis ( ...) parameter, so that these arguments can be used in the args parameter of do.call(what, args) . #I think I've figured out a method that uses environment() and match.call() (see example below). #I'm looking for feedback about problems with my approach, and suggestions about better ways to do this. #Thank you! #Related posts #https://stackoverflow.com/questions/51259346/how-to-get-names-of-dot-dot-dot-arguments-in-r #https://stackoverflow.com/questions/35317587/extract-names-of-dataframes-passed-with-dots #https://stackoverflow.com/questions/17256834/getting-the-arguments-of-a-parent-function-in-r-with-names #Example #Note: "udf_" indicates this is a "user-defined function" #start udf_return_all_arguments udf_return_all_arguments <- function (...) { #obtain all arguments passed to or being used by a function, including arguments passed to the function using the "three dots" ellipsis ( ...) parameter # #this obtains the arguments for parameters explicitly listed in the function env <- as.list( environment() ) #this obtains the arguments for parameters NOT explicitly listed in the function and included using the 3 dots ellipses ( ... ) parameters feature mc <- match.call(expand.dots = FALSE) dots <- as.list( mc$...) #these are all the arguments from the function args_in <- c(env, dots) return(args_in) } # end udf_return_all_arguments ################################################################ #start udf_pass_all_argumens_to_do_call udf_pass_all_argumens_to_do_call <- function(x, y, z = NULL, na.rm = T, FUN, ... ) { #obtain all arguments passed to or being used by a function, including arguments passed to the function using the "three dots" ellipsis ( ...) parameter # #this obtains the arguments for parameters explicitly listed in the function env <- as.list( environment() ) #this obtains the arguments for parameters NOT explicitly listed in the function and included using the 3 dots ellipses ( ... ) parameters feature mc <- match.call(expand.dots = FALSE) dots <- as.list( mc$...) #these are all the arguments from the function args_in <- c(env, dots) do.call( what = FUN, args = args_in) } #end udf_pass_all_argumens_to_do_call my_list_all_args <- udf_pass_all_argumens_to_do_call(x = 123, y 456, FUN = udf_return_all_arguments, non_specified_paramter = "this is an example") my_list_all_args ### end of example
Kelly Thompson
2022-Mar-14 17:51 UTC
[R] obtain names & values of all arguments passed to a function including args passed using the "three dots" ellipsis ( ...) parameter, for use in do.call
Sorry for the prior post, I think I found a better way. I can just use as.list( match.call()[-1] ) Here's an example: fn_return_args_in <- function(x = NULL, y, ...){ return( as.list( match.call() [-1] ) ) } do.call(what = fn_return_args_in, args = list(x=1, y=2, zebra = 44, dog = 'snoopy') ) do.call(what = fn_return_args_in, args = list(y=2, zebra = 44, dog = 'snoopy') ) On Sat, Mar 12, 2022 at 1:29 PM Kelly Thompson <kt1572757 at gmail.com> wrote:> > #What are "good" ways to obtain all arguments passed to or being used > by a function, including arguments passed to the function using the > "three dots" ellipsis ( ...) parameter, so that these arguments can be > used in the args parameter of do.call(what, args) . > > #I think I've figured out a method that uses environment() and > match.call() (see example below). > > #I'm looking for feedback about problems with my approach, and > suggestions about better ways to do this. > > #Thank you! > > #Related posts > #https://stackoverflow.com/questions/51259346/how-to-get-names-of-dot-dot-dot-arguments-in-r > #https://stackoverflow.com/questions/35317587/extract-names-of-dataframes-passed-with-dots > #https://stackoverflow.com/questions/17256834/getting-the-arguments-of-a-parent-function-in-r-with-names > > #Example > > #Note: "udf_" indicates this is a "user-defined function" > > #start udf_return_all_arguments > udf_return_all_arguments <- function (...) { > > #obtain all arguments passed to or being used by a function, including > arguments passed to the function using the "three dots" ellipsis ( > ...) parameter > # > #this obtains the arguments for parameters explicitly listed in the function > env <- as.list( environment() ) > > #this obtains the arguments for parameters NOT explicitly listed in > the function and included using the 3 dots ellipses ( ... ) > parameters feature > mc <- match.call(expand.dots = FALSE) > dots <- as.list( mc$...) > > #these are all the arguments from the function > args_in <- c(env, dots) > > return(args_in) > > } # end udf_return_all_arguments > > ################################################################ > > #start udf_pass_all_argumens_to_do_call > udf_pass_all_argumens_to_do_call <- function(x, y, z = NULL, na.rm > = T, FUN, ... ) { > > #obtain all arguments passed to or being used by a function, including > arguments passed to the function using the "three dots" ellipsis ( > ...) parameter > # > #this obtains the arguments for parameters explicitly listed in the function > env <- as.list( environment() ) > > #this obtains the arguments for parameters NOT explicitly listed in > the function and included using the 3 dots ellipses ( ... ) parameters > feature > mc <- match.call(expand.dots = FALSE) > dots <- as.list( mc$...) > > #these are all the arguments from the function > args_in <- c(env, dots) > > do.call( what = FUN, args = args_in) > > } #end udf_pass_all_argumens_to_do_call > > my_list_all_args <- udf_pass_all_argumens_to_do_call(x = 123, y > 456, FUN = udf_return_all_arguments, non_specified_paramter = "this is > an example") > my_list_all_args > ### end of example