【问题标题】:Extracting parameter names in nested functions in R在R中的嵌套函数中提取参数名称
【发布时间】:2021-08-04 15:40:43
【问题描述】:

我想将函数参数的名称提取为字符串。

除非从另一个函数中调用该函数(见下文),否则它可以正常工作。

必须有一个简单的解决方案,只是似乎找不到。

library(reprex)
print_data_1 <- function(DATA) {
  DATA_txt <- deparse(substitute(DATA))
  print(DATA_txt)
}

print_data_2 <- function(DF) {
  print_data_1(DF)
}

print_data_1(mi_d)
#> [1] "mi_d"
print_data_2(mi_d)
#> [1] "DF"

print_data_2 应该返回“mi_d”。

由 reprex package (v2.0.0) 于 2021-05-14 创建

【问题讨论】:

    标签: r function nested lazy-evaluation variable-names


    【解决方案1】:

    这是使用rlang 的一种方式。这东西很快就变得相当先进了。

    library(rlang)
    
    print_data_1 <- function(DATA) {
      .DATA <- enquo(DATA)
      .DATA_txt <- as_name(.DATA)
      
      print(.DATA_txt)
    }
    
    print_data_2 <- function(DF) {
      .DF <- enquo(DF)
      
      print_data_1(!!.DF)
    }
    
    print_data_1(mi_d)
    #> [1] "mi_d"
    print_data_2(mi_d)
    #> [1] "mi_d"
    

    等等……

    print_data_3 <- function(X) {
      .X <- enquo(X)
      
      print_data_2(!!.X)
    }
    
    print_data_3(mi_d)
    #> [1] "mi_d"
    
    • enquo() 将引用用户参数。
    • !! 会将参数取消引用到函数中。
    • as_name() 会将引用的参数转换为字符。

    cheatsheet 非常有用,rlang 小插曲也是如此。

    要取回该对象的值,您可以在 quosure 上使用eval_tidy()。

    print_data_1 <- function(DATA) {
      .DATA <- enquo(DATA)
      .DATA_txt <- as_name(.DATA)
      
      df <- eval_tidy(.DATA)
      
      print(.DATA_txt)
      df
    }
    
    print_data_2(mtcars)
    

    【讨论】:

    • 感谢!如果我想在“print_data_1”中使用数据框“mi_d”,我该怎么做?我需要将数据框称为文本,而在函数的其他部分将其称为数据框。
    • 好吧,您可以单独使用DATA 变量。或者您可以使用!! 在函数内取消引用它。或者您可以在 quosure 上使用eval_tidy()。
    • 正是我需要的。
    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多