在switch语句中使用其名称将没有引号的参数传递给R函数

Laz*_*ton 1 r

我有一个函数刷新从DB传递的新变量(在某些条件下).如果不满足条件集,则返回值本身就是变量而没有变化.条件并不重要,但是在名称上传递带引号的变量的方法就是麻烦.有没有办法在没有引号的情况下传递参数.

考虑下面的玩具功能ref.我们需要将变量直接作为参数传递.目前,只有将变量名称作为字符向量传递时,此函数才起作用.

abc=55
wxy=44
ref<-function(variable_name=NULL){
    if(exists(variable_name))
    {
        updated_df = switch(variable_name,
                        "abc"=paste("Variable1:",variable_name,get(variable_name)),
                        "wxy"=paste("Variable2:",variable_name,get(variable_name)),
                            "NOT FOUND")
    } else stop("passed variable  does not exist")
    if(updated_df=="NOT FOUND") updated_df = get(variable_name)
     updated_df
}
Run Code Online (Sandbox Code Playgroud)

相似但不相同的问题是在这里.它没有帮助.

G. *_*eck 7

1)使用deparse(substitute(x))得到的名称.没有使用包裹.

ref <- function(variable) {
    name <- deparse(substitute(variable))
    cat("name:", name, "value:", variable, "\n")
}

# test

abc <- 55
ref(abc)
## name: abc value: 55 
Run Code Online (Sandbox Code Playgroud)

2)另一种可能性是通过一个公式:

ref2 <- function(formula) {
    name <- all.vars(formula)[1]
    variable <- get(name, environment(formula))
    cat("name:", name, "value:", variable, "\n")
}

# test

abc <- 55
ref2(~ abc)
## name: abc value: 55 
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的优点是没有依赖性。它确实在第一行中明确指出*未使用任何包*。如果您要请别人花时间回答您的问题,则需要承诺以查看答案。 (2认同)

akr*_*run 6

我们可以使用enquo/quoname来自rlang

ref <- function(variable_name=NULL){
      variable_name <- rlang::quo_name(rlang::enquo(variable_name))
    if(exists(variable_name)){
        updated_df = switch(variable_name,
                        "abc"=paste("Variable1:",variable_name,get(variable_name)),
                        "wxy"=paste("Variable2:",variable_name,get(variable_name)),
                            "NOT FOUND")
    } else stop("passed variable  does not exist")
    if(updated_df=="NOT FOUND") updated_df = get(variable_name)
     updated_df
}

ref(abc)
#[1] "Variable1: abc 55"
Run Code Online (Sandbox Code Playgroud)

除了上面的改变之外,我们还可以使用eval_tidyon a quosure 来替换getandgluepaste

ref <- function(variable_name=NULL){
      vname <- enquo(variable_name)

      variable_name <- rlang::quo_name(vname)
    if(exists(variable_name)){
        updated_df = switch(variable_name,
                 "abc"= glue::glue("Variable1: {variable_name} {rlang::eval_tidy(vname)}"),
                 "wxy"= glue::glue("Variable2: {variable_name} {rlang::eval_tidy(vname)}"),
                 "NOT FOUND")
    } else stop("passed variable  does not exist")
    if(updated_df=="NOT FOUND") updated_df = vname
     updated_df
}

ref(abc)
#[1] "Variable1: abc 55"
Run Code Online (Sandbox Code Playgroud)