Извлечь значения параметров функции, переданные в параметр функции - PullRequest
0 голосов
/ 27 февраля 2019

Я могу получить доступ к значениям параметров, переданным в функцию, структурированную как именованный список, с помощью

compile_name <- function(first_name, last_name){
  paste(first_name, last_name)
}

create_project <- function(project_name,...) {
  print(as.list(match.call()))
}

create_project(project_name = compile_name(first_name = "first", last_name = "last"), more_stuff = "more")


[[1]]
create_project

$project_name
compile_name(first_name = "first", last_name = "last")

$more_stuff 
[1] more

Есть ли способ разрешить параметры функции, передаваемой в параметре (здесь имя_проекта), а также всписок.В приведенном выше примере я получаю вызов функции в виде строки в точке списка для параметра project_name.Вот так:

 [[1]]
create_project

$project_name
  $first_name 
    [1] "first"
  $last_name
    [1] "last"

$more_stuff 
[1] "more"

Кроме того, есть ли способ проверить, содержит ли параметр функцию, реагирующую на это внутри функции?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Вы просто ищете list(...)?

create_project = function (project_name, ...) {
    lst = list(...)
    # do something with `lst`.
}
0 голосов
/ 28 февраля 2019
compile_name <- function(first_name, last_name){
  paste(first_name, last_name)
}

convert_call_to_list <- function(x) {
  if (is.call(x)) as.list(x) else x
}

create_project <- function(project_name,...) {
  first_pass <- as.list(match.call())
  second_pass <- lapply(first_pass, convert_call_to_list)
  setNames(second_pass, names(first_pass))
}

create_project(project_name = compile_name(first_name = "first", last_name = "last"), more_stuff = "more")
#> [[1]]
#> create_project
#> 
#> $project_name
#> $project_name[[1]]
#> compile_name
#> 
#> $project_name$first_name
#> [1] "first"
#> 
#> $project_name$last_name
#> [1] "last"
#> 
#> 
#> $more_stuff
#> [1] "more"

Создано в 2019-02-27 пакетом представ (v0.2.1)

0 голосов
/ 27 февраля 2019

Вот функция, которая проверяет, имеет ли какой-либо из ее аргументов тип «язык» (т. Е. Выражение), и, если это так, дополнительно проверяет, являются ли какие-либо из этих аргументов функциями:

my_function <- function(a, b) {
  args <- as.list(match.call())[-1]

  if (is.language(args$b)) {
    sub_args <- as.list(match.call(call = substitute(b)))
  }

  if (any(sapply(sub_args, is.symbol))) {
    print('found a sub-function!')
    print(sub_args)
  }
}

my_function(a = 10, b = my_function(1, mean))

[1] "found a sub-function!"

[[1]]
my_function

$a
[1] 1

$b
mean
...