8

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

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

assign(USER.DEFINED.VARIABLE,c(1,2,3,4,5))

“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”实际上是一个文本字符串名称。我想引用 jimsfilename,但我所拥有的只是 USER.DEFINED.VARIABLE 来指示它。我敢肯定这很容易...

4

3 回答 3

10

这取决于你想做什么,但这里有一个使用get函数的例子:

x = 1
get("x") + 1

2

assign("name", get("x") + 1)
name

2

于 2013-03-16T20:30:26.983 回答
3

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

更好的是在函数中使用你自己的变量名,然后只返回结果并让用户决定在那个时候给它命名。这是更 Rish 的做事方式,最好根本不使用该assign功能。assign通过使用列表和下标可以更简单地完成 大多数可以使用的事情。

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

于 2013-03-16T22:08:03.573 回答
1

您可以使用evalparse。后者将文本解释为控制台中的输入。第一个计算表达式(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
于 2013-03-16T20:32:30.923 回答