Harold: As a general rule, if you are using eval(parse(...)) you are doing it poorly in R; cf
library("fortunes") fortune(106) Why is something like this not suitable: fun1 <- function(a1,a2,a3 = c("hi","by")) { cat(a3,a1+a2,"\n") } > fun1 (1,2) hi by 3 > fun1(1,2, a3 = "whoopee") whoopee 3 ... or, if you want to include the function as an argument of a list: > myArgs <- list(fun=fun1, arglist=list(a1=2, a2 =5, a3 = c("hi","by"))) For which you can do stuff like: > do.call(myArgs[[1]],myArgs[-1][[1]]) hi by 7 > arglist <- myArgs[-1][[1]][-3] > do.call(myArgs[[1]],c(arglist,a3 = "whoopee")) whoopee 7 etc. etc. See ?do.call Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Tue, Jun 6, 2017 at 8:01 AM, Doran, Harold <hdo...@air.org> wrote: > I am writing a program where non-technical R users will read in a config file > and the config file will then parse the arguments found within the config and > pass them to respective functions. I'm having trouble (efficiently) writing a > piece of code to retain quotation marks around the argument which requires it > as input, as found in the example function below, myFuncton1. > > Below is a minimal, reproducible example of the issue with comments. > > ### This is a sample structure of the configuration file > > scoreConfig <- structure(list(Function = c("myFunction1", "myFunction1", > "myFunction1", > "myFunction2", "myFunction2"), Argument = c("arg1", "arg2", "arg3", > "arg1", "arg2"), Value = c("5", "10", "Hello", "5", "10"), Class = > c("numeric", > "numeric", "character", "numeric", "numeric")), .Names = c("Function", > "Argument", "Value", "Class"), class = "data.frame", row.names = c(NA, > -5L)) > > ### Two sample functions, once of which requires a string > myFunction1 <- function(arg1, arg2, arg3 = c('Hello', 'Goodbye')){ > arg3 <- match.arg(arg3) > result <- arg1 + arg2 > cat(arg3, result, '\n') > } > > > myFunction2 <- function(arg1, arg2){ > result <- arg1 * arg2 > result > } > > > ### Working Example. > ### myFunction2 works no problem > myFunction2Vals <- subset(scoreConfig, Function == 'myFunction2') > myOptions <- with(myFunction2Vals, paste(Argument, Value, sep = '=', collapse > = ',')) > eval(parse(text = paste( "myFunction2(", myOptions, ")" ))) > > > ### myFunction1 fails > myFunction1Vals <- subset(scoreConfig, Function == 'myFunction1') > myOptions <- with(myFunction1Vals, paste(Argument, Value, sep = '=', collapse > = ',')) > eval(parse(text = paste( "myFunction1(", myOptions, ")" ))) > > ### What I want is simply > myFunction1(arg1 = 1, arg2 = 2, arg3 = 'Hello') > > I'm curious if someone has a perspective on the most efficient way to > automate this by using information provided in the 'Value" column, so perhaps > conditional on that value it could wrap the name in quotes. > > I admit to running into a limit and am tapping out so to speak on the right > way to do this. > > Thanks for any advice > Harold > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.