简体   繁体   中英

Can I evaluate an argument in a subsequent function call?

Is it possible to evaluate a function argument in a subsequent function call multiple times, when the value that I try to capture may change inside the mother function?

The problem I have is similar to the example below. I have a mother function f1() with a child function rnorm() inside a for loop. The child function should receive a different argument in each iteration of the loop (ie, rnorm(n = ii) , but I want to control this at the level of the mother function.

f1 <- function(I, n = 1) {

    res <- vector("list", length = I)

    for (ii in seq_len(I)) {
        res[[ii]] <- rnorm(n = n)
    }
    return(res)
}

f1(I = 2, n = 1)
f1(I = 2, n = ii) # desired, but obviously doesn't work

I tried to play around with eval() , quote() , get() , etc. but to no avail.

You want non-standard evaluation, which means you need to modify the expression based on a function parameter (typically using substitute ) before it is evaluated.

f1 <- function(I, n = 1) {

  nval <- substitute(n)


  res <- vector("list", length = I)

  if (is.numeric(nval)) {
    for (ii in seq_len(I)) {
      res[[ii]] <- rnorm(n = n)
    }
  } 

  if (is.name(nval)) {
    for (ii in seq_len(I)) {
      res[[ii]] <- eval(substitute(rnorm(n = nval), list(nval = nval)))
    }
  }

  return(res)
}

f1(I = 2, n = 1)
#[[1]]
#[1] 0.4600974
#
#[[2]]
#[1] -0.6399949

f1(I = 2, n = ii)
#[[1]]
#[1] 0.4554501
#
#[[2]]
#[1] 0.7048373 1.0351035

I think your example is just poor software design. I strongly advise against doing it.

A much better approach would be this:

f1 <- function(I, n) {

  res <- vector("list", length = I)

  if (missing(n)) {
    for (ii in seq_len(I)) {
      res[[ii]] <- rnorm(n = ii)
    }
  } else {
    for (ii in seq_len(I)) {
      res[[ii]] <- rnorm(n = n)
    }
  }

  return(res)
}

f1(I = 2, n = 1)
f1(I = 2)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM