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