R: Building functions – using default settings that can be modified via the dot-dot-dot / three point argument
[This article was first published on "R" you ready?, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Before you read this post, please have a look at Enrique’s comment below. He pointed out that the built-in R function modifyList() already does what I wanted to describe in this post. Well, I live to learn 🙂
I was wondering how I could write a function that uses default settings but accepts a list to overwrite the default settings via the dot-dot-dot / three-point argument. Here comes my solution.
# building a function with a list of default settings # that can be modified by an optional list passed # via the dot-dot-dot / three point argument
###############################################################
myFunction <- function(...)
{
print(hasArg(settings))
}
myFunction()
myFunction(settings=list(par1=8))
###############################################################
# now I define a default setting list
myFunction <- function(...)
{
print(hasArg(settings))
# define default settings
settings = list(par1=10, par2=12)
print(settings)
}
myFunction()
myFunction(settings=list(par1=8))
###############################################################
# as a next step I replace all the elements passed on to
# settings via the dot-dot-dot argument
myFunction <- function(...)
{
# default settings
settings = list(par1=10, par2=12)
# if settings argument is used
if(hasArg(settings)){
suppliedSettings <- list(...)$settings
matching <- intersect(names(settings),
names(suppliedSettings))
settings[matching] <- suppliedSettings[matching]
}
# function operations
print(settings)
}
myFunction()
myFunction(settings=list(par1=8))
# Now the settings have changed.
###############################################################
# If now some settings are supplied that do not match they
# are simply not considered
myFunction(settings=list(par1=8, parX=6))
# For convenience I add a line to warn the user in case of not
# matching parameters
myFunction <- function(...)
{
# default settings
settings = list(par1=10, par2=12)
# if settings is supplied
if(hasArg(settings)){
suppliedSettings <- list(...)$settings
matching <- intersect(names(settings),
names(suppliedSettings))
settings[matching] <- suppliedSettings[matching]
notMatching <- setdiff(names(suppliedSettings),
names(settings))
if(length(notMatching)!=0) warning(paste("The
following arguments are ignored: ", notMatching))
}
# function operations
print(settings)
}
###############################################################
myFunction(settings=list(par1=8, parX=6))
# now the user is warned when some arguments do not match
by Mark Heckmann, April, 2009
To leave a comment for the author, please follow the link and comment on their blog: "R" you ready?.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.