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

时间:2017-04-05 04:12:17

标签: r parsing get eval assign

我可以从文本创建一个变量,如果是循环,我将有几个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和循环示例

2 个答案:

答案 0 :(得分:1)

我真的认为你在这里走的是一条糟糕的道路。您似乎将重要信息存储在变量名称本身中,这实际上并不是大多数编程语言所喜欢的。最好将名称与值分开。但是,如果您控制fx_1,则可以将其更改为单独获取值和名称,甚至将其默认为大多数“正常”案例的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()的数量会将变量“看起来像”更改为函数。如果需要操作参数名称,则需要使用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)))
})

返回

                                                                         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)

答案 1 :(得分:0)

因此计划的输出如下:

"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)
})

这里有一个参数的解决方案。我纠正了&#34; get&#34;以便它在父环境中查看:

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"))
})