Захват и оценка аргументов функции в теле функции - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы захватить аргументы функции в ее теле, чтобы помочь с регистрацией. Я обнаружил, что match.call() и sys.call() работают, когда значение аргумента явно указано в вызове функции, но не выводят оцененное значение, когда используется имя объекта.

Вот упрощенный пример:

gauss_vector <- function(number) {
  sys_args <- as.list(sys.call())
  match_args <- as.list(match.call())
  output <- rnorm(n = number)
  list(sys_args,
       match_args,
       output)
}

Когда эта функция вызывается так:

gauss_vector(number = 5)

Результирующий список содержит значение 5.

[[1]]
[[1]][[1]]
gauss_vector

[[1]]$number
[1] 5


[[2]]
[[2]][[1]]
gauss_vector

[[2]]$number
[1] 5


[[3]]
[1]  0.9663434  0.8051087  0.1576298  0.3189806 -2.3110680

Однако, когда функция вызывается так:

n <- 5
gauss_vector(number = n)

Результирующий список включает только n.

[[1]]
[[1]][[1]]
gauss_vector

[[1]]$number
n


[[2]]
[[2]][[1]]
gauss_vector

[[2]]$number
n


[[3]]
[1] -0.6017670 -0.7631405  0.7793892 -0.7529637  1.3022802

Существует ли способ получения оцененного числа, а не имени объекта, когда функция вызывается вторым способом?

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете eval все аргументы, переданные функции.

gauss_vector <- function(number) {

   sys_args <- as.list(sys.call())
   sys_args[-1] <- lapply(sys_args[-1], eval)
   match_args <- as.list(match.call())
   match_args[-1] <- lapply(match_args[-1], eval)
   output <- rnorm(n = number)
   list(sys_args,match_args,output)
}

gauss_vector(n)
#[[1]]
#[[1]][[1]]
#gauss_vector

#[[1]][[2]]
#[1] 5


#[[2]]
#[[2]][[1]]
#gauss_vector

#[[2]]$number
#[1] 5


#[[3]]
#[1]  0.6998265  0.4037748  1.8558809 -0.1343624 -1.5600925
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...