如何使用一个变量来命名R中的另一个变量?

如何使用一个变量来命名R中的另一个变量?,r,variables,R,Variables,我有一个函数,它使用readline允许用户输入他们想要为我将为他们创建的变量指定的名称。让我们称之为“USER.DEFINED.VARIABLE”。它包含我要用于另一个变量的名称。假设“USER.DEFINED.VARIABLE”被readline设置为“jimsfilename” 我知道我可以使用以下方法为名为“jimsfilename”的变量赋值: “jimsfilename”现在将包含1,2,3,4,5。然而,如果我(在readline将其分配给USER.DEFINED.VARIABLE

我有一个函数,它使用
readline
允许用户输入他们想要为我将为他们创建的变量指定的名称。让我们称之为“USER.DEFINED.VARIABLE”。它包含我要用于另一个变量的名称。假设“USER.DEFINED.VARIABLE”被
readline
设置为“jimsfilename”

我知道我可以使用以下方法为名为“jimsfilename”的变量赋值:

“jimsfilename”现在将包含
1,2,3,4,5
。然而,如果我(在readline将其分配给USER.DEFINED.VARIABLE之前)不知道它的名称,那么我现在如何对“jimsfilename”大惊小怪呢

换句话说,假设我现在想为jimsfilename中的每个值添加1。我做不到:

USER.DEFINED.VARIABLE <- USER.DEFINED.VARIABLE + 1 # can't do this

USER.DEFINED.VARIABLE这取决于您想做什么,但下面是一个使用
get
函数的示例:

x = 1
get("x") + 1
二,

二,


您可以使用
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
您还可以使用
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
>eval(替换为x eval(as.symbol(varname),envir=.GlobalEnv)
[1] 420

为什么不直接对变量进行所有操作(添加1或其他更改)使用您自己的名称创建变量的本地副本,然后在函数/脚本/任何操作结束时进行赋值或其他保存?这比创建变量然后必须使用
get
获取副本、更改副本并再次
assign
要简单得多

更好的方法是在函数内部使用您自己的变量名,然后返回结果并让用户决定在该点命名它。这是一种更加危险的方法,最好不要使用
assign
函数。使用
assign
可以完成的大多数事情都可以通过使用列表和订阅


函数不应改变全局环境中的任何内容,只需返回用户可能需要的任何值,并让用户进行分配。

我认为您正在让新用户暴露在不需要的语言复杂性中,而使用
get
更容易解决这些问题。非常同意@DWin。我很想否决这个answe因为我认为这是一个很糟糕的建议,即使我看到它是真诚的。@BenBolker,@DWin。伙计们,我们不要低估我们的新用户……当我还是r的新手时,我对所有的
deparse
“和
替代品
”感到困惑。但接触到它并没有给我带来除兴奋剂以外的任何影响让我真正理解发生了什么。如果我明白了(至少在某种程度上,无穷大大于零),那么其他人也能明白。我不认为他们不一定明白(尽管这是其中的一部分);我认为解决这个问题的方法是错误的。最好、最惯用的方法是使用列表;
get
assign
是第二好的方法;
eval
/
parse
是第三好的方法。
library(fortunes);fortune(106)
说“如果答案是parse(),你通常应该重新思考这个问题。”。有经验的用户已经被
解析
/
替换
的怪癖咬了一口,并学会了避免使用它们,除非它们是绝对必要的…@BenBolker,我刚刚安装了
财富
软件包。哈哈。谢谢你的链接。好吧,我必须承认。我的目标不仅是解决他眼前的问题,而且是介绍h我有一些很好的语言功能。+1-是的,使用列表。而不是
assign
do
aList[[USER.DEFINED.VARIABLE]]
> eval(as.symbol(varname), envir=.GlobalEnv)
[1] 42
> 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