r - 在 eval/parse 之后获取变量名称或获取

r - get variable name after eval/parse or get

我可以从文本创建一个变量,如果是从一个循环中,我将在其中有几个 x

fx_1 <-function(varname)
{
  print(paste("fx_1|variable:",deparse(substitute(varname)),"| value:",paste(varname,collapse = "@")))
}

sapply(c("var1","var2"),function(x){
  assign(paste0("Example_Module_",x,"_IDS"),c("test","with","getevalparse",x))
  fx_1(eval(parse(text=paste0("Example_Module_",x,"_IDS"))))
  fx_1(get(paste0("Example_Module_",x,"_IDS")))
})

[1] "fx_1|variable: eval(parse(text = paste0(\"Example_Module_\", x, \"_IDS\"))) | value: test@with@getevalparse@var1"
[1] "fx_1|variable: get(paste0(\"Example_Module_\", x, \"_IDS\")) | value: test@with@getevalparse@var1"
[1] "fx_1|variable: eval(parse(text = paste0(\"Example_Module_\", x, \"_IDS\"))) | value: test@with@getevalparse@var2"
[1] "fx_1|variable: get(paste0(\"Example_Module_\", x, \"_IDS\")) | value: test@with@getevalparse@var2"

但是在我的循环中,我需要将此变量传递给使用 deparse(substitute()) 命名输出文件的函数,类似于上面的函数 fx_1。我天真地希望恢复一些 Example_Module_1_IDS

Example_Module_1_IDS=c("test","with","var")
fx_1(Example_Module_1_IDS)
[1] "fx_1|variable: Example_Module_1_IDS | value: test@with@var"

as.symbol也没有用,所以我想知道是否有办法做到这一点?

编辑 添加函数fx_1 和循环示例

因此,计划的输出如下:

"fx_1|variable: Example_Module_var1_IDS | value: test@with@getevalparse@var1" 
"fx_1|variable: Example_Module_var1_IDS | value: test@with@getevalparse@var2"

有了两个变量的函数,就更容易了。 (我也删除了印刷品):

fx_2 <-function(varname, value)
{
  paste("fx_1|variable:", varname, "| value:", paste(value, collapse = "@"))
}

sapply(c("var1","var2"), function(x) {
  value <- c("test","with","getevalparse",x)
  varname <- paste0("Example_Module_",x,"_IDS")
  fx_2(varname, value)
})

这里是一个参数的解决方案。我更正了 "get" 以便它在父环境中看起来:

fx_1 <-function(varname)
{
  paste("fx_1|variable:",varname,"| value:", 
        paste(get(varname, envir = parent.frame()),collapse = "@"))
}

sapply(c("var1","var2"), function(x) {
  assign(paste0("Example_Module_",x,"_IDS"), c("test","with","getevalparse",x))
  fx_1(paste0("Example_Module_",x,"_IDS"))
})

我真的认为你走错了路。似乎您将重要信息存储在变量名称本身中,这并不是大多数编程语言所喜欢的。最好将名称与值分开。但是,如果您控制 fx_1,您可以将其更改为分别获取值和名称,甚至在大多数 "normal" 情况下,甚至将其默认为 deparse() 值。例如

fx_1 <-function(var, varname=deparse(substitute(var))) {
     paste("fx_1|variable:",varname,"| value:",paste(var,collapse = "@"))
}
fx_1(x)
# [1] "fx_1|variable: x | value: 1@2@3"
fx_1(get("x"), "x")
# [1] "fx_1|variable: x | value: 1@2@3"

函数调用中没有任何数量的 get()eval() 会将变量 "looks like" 更改为函数。如果您需要操作参数名称,则需要使用像 do.call() 这样的函数。例如

sapply(c("var1","var2"),function(x){
  varname <- paste0("Example_Module_",x,"_IDS")
  assign(varname ,c("test","with","getevalparse",x))
  do.call("fx_1", list(as.symbol(varname)))
})

哪个returns

                                                                         var1 
"fx_1|variable: Example_Module_var1_IDS | value: test@with@getevalparse@var1" 
                                                                         var2 
"fx_1|variable: Example_Module_var2_IDS | value: test@with@getevalparse@var2" 

但是,更常见和更容易使用的解决方案涉及命名列表

Example_Module_IDS <- Map(function(x) c("test","with","getevalparse",x), c("var1","var2"))
Example_Module_IDS[["var1"]]
Example_Module_IDS[["var2"]]
printnv <- function(n, v) paste("fx_1|variable:",n,"| value:",paste(x,collapse = "@"))
mapply(printnv, names(Example_Module_IDS), Example_Module_IDS)