Easymode44
Easymode44

Reputation: 148

Passing arguments of an R function which is itself an argument

Environments and the like have always confused me incredibly in R. I guess therefore this is more of a reference request, since I've been surfing the site for the last hour in search of an answer to no avail.

I have a simple R function called target defined as follows

target <- function(x,scale,shape){

    s <- scale
    b <- shape

    value <- 0.5*(sin(s*x)^b + x + 1)
    return(value)

}

I then define the function AR

AR <- function(n,f,...){
    variates <- NULL

    for(i in 1:n){
        z <- runif(1)
        u <- runif(1)

        if(u < f(z, scale, shape)/c){
            variates[i] <- z
            }else{next}

}
    variates <- variates[!is.na(variates)]
    return(variates)
}

in which the function target is being evaluated. Unfortunately, the call returns the following error

sample <-  AR(n = 10000, f = target, shape = 8, scale = 5)
     Error in fun(z, scale, shape) : object 'shape' not found

I know this has to do with the function AR not knowing where to look for the objects shape and scale, but I thought that was exactly the job of the ellipsis: allowing me to sort of put argument definition "on hold" until one actually calls the function. Where am I wrong and could anyone give me a lead as to where to look for insight on this specific problem?

Upvotes: 1

Views: 97

Answers (1)

emilliman5
emilliman5

Reputation: 5956

You are very close, you just need to make use of your ellipses...

NB: c was not defined in AR so I added it and gave it a value.
NB2: I would refrain from using c and sample in your function as these themselves are functions and could cause some confusion downt he road.

AR <- function(n, f, c, ...){
  variates <- NULL

  for(i in 1:n){
    z <- runif(1)
    u <- runif(1)

    if(u < f(z, ...)/c){ ##instead of using shape and scale use the ellipses and R will insert any parameters here which were not defined in the function
      variates[i] <- z
    }else{next}

  }
  variates <- variates[!is.na(variates)]
  return(variates)
}

sample <-  AR(n = 10000, f = target, shape = 8, scale = 5, c = 100)

Upvotes: 1

Related Questions