我有一个使用readline
的函数,允许用户输入他们想要为我们为他们创建的变量的名称。我们称之为“USER.DEFINED.VARIABLE”。它包含我想用于另一个变量的名称。假设“{。{1}}将”USER.DEFINED.VARIABLE“设置为”jimsfilename“。
我知道我可以使用:
为名为“jimsfilename”的变量赋值readline
“jimsfilename”现在将包含assign(USER.DEFINED.VARIABLE,c(1,2,3,4,5))
。但是,我现在如何对“jimsfilename”大惊小怪,因为我没有(在readline将其分配给USER.DEFINED.VARIABLE之前)知道它的名字是什么?
换句话说,假设我现在要为jimsfilename中的每个值添加1。我不能这样做:
1,2,3,4,5
因为“USER.DEFINED.VARIABLE”实际上是一个文本字符串名称。我想要引用jimsfilename,但我只有USER.DEFINED.VARIABLE来表示它。我确信这很容易......
答案 0 :(得分:6)
这取决于您想要做什么,但这是使用get
函数的示例:
x = 1
get("x") + 1
2
assign("name", get("x") + 1)
name
2
答案 1 :(得分:3)
为什么不用变量(使用自己的名称)对变量的本地副本进行所有操作(添加1或其他更改),然后在函数/脚本的末尾/分配或其他保存的任何内容?这比创建变量要简单得多,然后必须使用get
获取副本,更改副本,再次assign
。
更好的方法是在函数内部使用自己的变量名,然后返回结果并让用户决定在该点命名的内容。这是更糟糕的做事方式,最好不要使用assign
功能。使用assign
可以使用列表和下标更简单地完成大多数事情。
函数不应该更改全局环境中的任何内容,只返回用户可能需要的任何值,并让用户进行赋值。
答案 2 :(得分:0)
您可以使用eval
和parse
。后者将文本解释为控制台中的输入。第一个计算表达式(例如,由parse
生成)。例如:
> varname <- "user.defined.variable"
> varvalue <- 42
> eval(parse(text=paste(varname, varvalue, sep=" <- ")), envir=.GlobalEnv)
> ls()
[1] "user.defined.variable" "varname" "varvalue"
> user.defined.variable
[1] 42
请注意,我选择全局环境作为新变量的目标。如果不是这种情况,您可以进行适当的更改。
要稍后引用新变量,您可以使用as.symbol
。只需在分配新变量的环境下进行评估:
> eval(as.symbol(varname), envir=.GlobalEnv)
[1] 42
您还可以使用substitute
创建eval
可以理解的表达式:
> eval(substitute(x+1, list(x=as.symbol(varname))), envir=.GlobalEnv)
[1] 43
要更改新变量,只需创建作业表达式并对其进行评估:
> eval(substitute(x <- x*10, list(x=as.symbol(varname))), envir=.GlobalEnv)
> eval(as.symbol(varname), envir=.GlobalEnv)
[1] 420