首页 > 解决方案 > 在R中传递匿名函数的变量值

问题描述

我创建了一个带有几个包装器的便利函数,出于这个问题的目的,它将任何输入转换为字符串,除非符号引用一个字符对象(检查下面省略的那个),在这种情况下它会添加内容该对象的输出。

一切正常,除了尝试使用匿名函数,我最终在匿名函数中捕获变量的名称,而不是它的值。我如何捕获价值?

my_wrapper <- function(...) { 
  
  
  input <- rlang::enquos(...)
  
  convert_all_args_to_strings(input)
  
}

convert_all_args_to_strings <- function(input) {
  
  expressions <- lapply(input, rlang::quo_get_expr)
  
  types <- vapply(expressions, typeof, FUN.VALUE = character(1))
  
  str_from_character <- unlist(expressions[types == "character"])
  
  symbols <- vapply(expressions[types == "symbol"],
                    FUN.VALUE = character(1),
                    rlang::as_name)
  
  objects <- mget(symbols, ifnotfound = list(NULL), 
                  inherits = T)
  
  str_from_objects <- unlist(objects)
  
  confirmed_symbols <- vapply(objects, is.null, 
                              FUN.VALUE = logical(1))
  
  
  str_from_symbols <- symbols[confirmed_symbols]
  
  c(str_from_character, str_from_symbols, 
    str_from_objects, use.names = FALSE)
  
  
}



places <- c("here", "there", "somewhere")

# DESIRED OUPTUT
my_wrapper("hier", "da", aqui, alla, places)
#> [1] "hier"      "da"        "aqui"      "alla"      "here"      "there"    
#> [7] "somewhere"

# DESIRED OUPTUT
lapply(places, my_wrapper, bla, bla, bla)
#> [[1]]
#> [1] "here" "bla"  "bla"  "bla" 
#> 
#> [[2]]
#> [1] "there" "bla"   "bla"   "bla"  
#> 
#> [[3]]
#> [1] "somewhere" "bla"       "bla"       "bla"

# WRONG OUPTUT
lapply(places, function(x) my_wrapper(x))
#> [[1]]
#> [1] "x"
#> 
#> [[2]]
#> [1] "x"
#> 
#> [[3]]
#> [1] "x"

标签: r

解决方案


推荐阅读