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