K. Brand
2012-Sep-26 15:56 UTC
[R] specifying arguments in functions and calling functions, within functions
Esteemed R UseRs,
Regarding specifying arguments in functions and calling functions
within functions:
## beginning ##
## some data
ex <- rnorm(10)
ex[5] <- NA
## example function
Scale <- function(x, method=c("mean", "median")) {
scl <- method
scl(x)
}
## both return NA
Scale(ex, method=median)
median(ex, na.rm=FALSE)
## both return the median
Scale(ex, method="median")
median(ex, na.rm=TRUE)
## 1. Why does the use of apostrophes have this effect when calling
## a fucntion within a function?
## 2. What's the canonical use of apostrophes in functions like the above:
## Scale <- function(x, method=c("mean", "median")) {....
## or
## Scale <- function(x, method=c(mean, median)) {....
## 3. How does one specify the arguments of a function being called
## within a function? i.e. i thought the use of '...' might work in
## the following but i was wrong.
## '...' has no apparent effect
Scale <- function(x, method=c("mean", "median"),...) {
scl <- method
scl(x)
}
## both return NA
Scale(ex, method=median, na.rm=TRUE)
Scale(ex, method=median, na.rm=FALSE)
## end ##
I failed to comprehend anything google returned when trying to
understand this myself. Greatly appreciate any thoughts &/or
examples on this.
Tia, Karl
--
Karl Brand
Dept of Cardiology and Dept of Bioinformatics
Erasmus MC
Dr Molewaterplein 50
3015 GE Rotterdam
T +31 (0)10 703 2460 |M +31 (0)642 777 268 |F +31 (0)10 704 4161
Sarah Goslee
2012-Sep-26 18:25 UTC
[R] specifying arguments in functions and calling functions, within functions
Hi, You have some basic confusion here, and a problem likely caused by an object named scl that exists in your global environment. On Wed, Sep 26, 2012 at 11:56 AM, K. Brand <k.brand at erasmusmc.nl> wrote:> Esteemed R UseRs, > > Regarding specifying arguments in functions and calling functions > within functions: > > ## beginning ## > ## some data > ex <- rnorm(10) > ex[5] <- NA > > ## example function > Scale <- function(x, method=c("mean", "median")) { > scl <- method > scl(x) > } > > ## both return NA > Scale(ex, method=median) > median(ex, na.rm=FALSE) > > ## both return the median > Scale(ex, method="median") > median(ex, na.rm=TRUE) > > ## 1. Why does the use of apostrophes have this effect when calling > ## a fucntion within a function?Those are double quotes, not apostrophes, and they don't have that effect:> Scale(ex, method=median)[1] NA> Scale(ex, method="median")Error in Scale(ex, method = "median") : could not find function "scl">You probably have something named scl in your global environment: you can see that with ls(). Take a look at:> class(median)[1] "function"> class("median")[1] "character" In your first example, you're passing a function to Scale(), which gives it a new name then uses it. In the second you're passing a character string that happens to be the name of a function, which Scale() gives a new name and then tries but fails to use (because it isn't a function). See also:> Scale(ex, "Nothing")Error in Scale(ex, "Nothing") : could not find function "scl"> ## 2. What's the canonical use of apostrophes in functions like the above: > ## Scale <- function(x, method=c("mean", "median")) {.... > ## or > ## Scale <- function(x, method=c(mean, median)) {....Depends on whether you want to pass a function or the name of a function.> ## 3. How does one specify the arguments of a function being called > ## within a function? i.e. i thought the use of '...' might work in > ## the following but i was wrong. > > ## '...' has no apparent effect > Scale <- function(x, method=c("mean", "median"),...) { > scl <- method > scl(x) > }You can pass them explicitly as named arguments, or with ... as you try. In either case you have to hand those off to the function you want to use them: Scale <- function(x, method=c("mean", "median"),...) { scl <- method scl(x, ...) } Scale <- function(x, method=c("mean", "median"), na.rm=FALSE) { scl <- method scl(x, na.rm=na.rm) }> ## both return NA > Scale(ex, method=median, na.rm=TRUE) > Scale(ex, method=median, na.rm=FALSE) > ## end ## > > > I failed to comprehend anything google returned when trying to > understand this myself. Greatly appreciate any thoughts &/or > examples on this.Many functions that come with R are written purely in R and use these capabilities so you can look at them for examples. Sarah -- Sarah Goslee http://www.functionaldiversity.org
Rui Barradas
2012-Sep-26 18:51 UTC
[R] specifying arguments in functions and calling functions, within functions
Hello,
You define a 2nd version of Scale with the dots argument but do not use it.
Scale2 <- function(x, method=c("mean", "median"),...) {
scl <- match.fun(method)
scl(x, ...) # Here!
}
Scale2(ex, method=median, na.rm=TRUE) # both return
Scale2(ex, method="median", na.rm=TRUE) # the median
You could also use 'na.rm = TRUE' instead of '...', since both
mean and
median use it. Anyway, if you define a function with certain arguments,
do try to use them in the function body. :)
As for the method argument, when the default value is a vector, it's
primary use is to check that one of those vector values and _only_ one
of those is passed to the function. More or less like this.
Scale3 <- function(x, method=c("mean", "median"),...) {
method <- match.arg(method)
scl <- match.fun(method)
scl(x, ...)
}
Scale3(ex, method=median, na.rm=TRUE) # Error
Scale3(ex, method="median", na.rm=TRUE) # Right
Scale3(ex, method="var", na.rm=TRUE) # Other type of error
Hope this helps,
Rui Barradas
Em 26-09-2012 16:56, K. Brand escreveu:> Esteemed R UseRs,
>
> Regarding specifying arguments in functions and calling functions
> within functions:
>
> ## beginning ##
> ## some data
> ex <- rnorm(10)
> ex[5] <- NA
>
> ## example function
> Scale <- function(x, method=c("mean", "median")) {
> scl <- method
> scl(x)
> }
>
> ## both return NA
> Scale(ex, method=median)
> median(ex, na.rm=FALSE)
>
> ## both return the median
> Scale(ex, method="median")
> median(ex, na.rm=TRUE)
>
> ## 1. Why does the use of apostrophes have this effect when calling
> ## a fucntion within a function?
>
> ## 2. What's the canonical use of apostrophes in functions like the
above:
> ## Scale <- function(x, method=c("mean", "median"))
{....
> ## or
> ## Scale <- function(x, method=c(mean, median)) {....
>
> ## 3. How does one specify the arguments of a function being called
> ## within a function? i.e. i thought the use of '...' might work in
> ## the following but i was wrong.
>
> ## '...' has no apparent effect
> Scale <- function(x, method=c("mean", "median"),...)
{
> scl <- method
> scl(x)
> }
>
> ## both return NA
> Scale(ex, method=median, na.rm=TRUE)
> Scale(ex, method=median, na.rm=FALSE)
> ## end ##
>
>
> I failed to comprehend anything google returned when trying to
> understand this myself. Greatly appreciate any thoughts &/or
> examples on this.
>
> Tia, Karl
>