8

readlineユーザーが作成する変数に付けたい名前をユーザーが入力できるようにするために使用する関数があります。これを「USER.DEFINED.VARIABLE」としましょう。別の変数に使用したい名前が含まれています。「USER.DEFINED.VARIABLE」が「jimsfilename」に設定されるとしましょうreadline

次を使用して、「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

evalとを使用できますparse。後者は、テキストをコンソールへの入力であるかのように解釈します。1つ目は、式を評価します(たとえば、によって生成さ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 に答える