【问题标题】:Extract parameter values of a function passed into parameter of function提取传递给函数参数的函数的参数值
【发布时间】:2019-02-27 20:12:19
【问题描述】:

我可以访问传递给结构为命名列表的函数的参数值

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)的函数的参数解析为列表。在上面的示例中,我最终在 project_name 参数的列表点中以字符串的形式调用函数。像这样:

 [[1]]
create_project

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

$more_stuff 
[1] "more"

另外,有没有办法检查一个参数是否包含一个函数来对函数内部的 this 做出反应?

【问题讨论】:

    标签: r function parameter-passing


    【解决方案1】:
    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"
    

    reprex package (v0.2.1) 于 2019 年 2 月 27 日创建

    【讨论】:

      【解决方案2】:

      您只是在寻找list(...)吗?

      create_project = function (project_name, ...) {
          lst = list(...)
          # do something with `lst`.
      }
      

      【讨论】:

        【解决方案3】:

        这是一个函数,它检查它的任何参数是否属于“语言”类型(即表达式),如果是,则进一步检查是否有任何 那些 参数是函数:

        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
        

        【讨论】:

        • 这并不能解决我的问题。如果我使用 my_function(a = compile_name(first_name = "first", last_name = "last")) 然后我得到 $a compile_name(first_name = "first", last_name = "last") 但不是一个解析参数的列表compile_name
        猜你喜欢
        • 2013-01-27
        • 2012-11-17
        • 2022-06-16
        • 2015-02-07
        • 2012-06-19
        • 2021-04-13
        • 1970-01-01
        • 2012-05-30
        • 2016-09-22
        相关资源
        最近更新 更多