3

関数内の値を関数外の環境にバインドする方法がわかりません。基本的な例を以下に示します。関数の最後の部分を解決できないようです。

number <- data.frame()

how_many_fruits <- function() {

    answer <- as.integer(readline(prompt="How Many?: "))
    globalenv()$number <- rbind(globalenv()$number, answer)

}

基本的に、最初に空のデータ フレームを呼び出しnumber、実行するたびhow_many_fruits()に入力をデータ フレームの下部にアタッチしたいと考えていますnumber

4

2 に答える 2

7

<<-次の演算子を使用できます。

number <- data.frame()
how_many_fruits <- function() {

  answer <- as.integer(readline(prompt="How Many?: "))  
  number <<- rbind(number, answer)

}

しかし、その手順であなたの目標は何なのだろうか。関数は、あなたのやり方でグローバル環境の変数を使用すべきではありません。誰かがその関数を使用したいが、num代わりに変数を呼び出すとどうなりnumberますか? その状態では機能しません。したがって、代わりに次のことを行うことをお勧めします。

how_many_fruits <- function(num) {

  answer <- as.integer(readline(prompt="How Many?: "))
  new_num <- rbind(num, answer)

  return (new_num)
}

number <- data.frame()
number <- how_many_fruits(number)

関数は次のように動作するはずです: 入力 (ここでは と呼びます) を受け取りnum、出力 (ここでは と呼びます) を返しますnew_num関数内の入力と出力の名前が、関数ので使用する変数の名前と同じである必要がないことに注意してください。を呼び出すとhow_many_fruits(number)、 の内容がnumberに格納されnum、関数は後者でのみ機能します。するとnumber <- how_many_fruits(number)、 の結果として返されるものはすべて にhow_many_fruits(number)格納されnumberます。

于 2016-05-21T08:04:17.173 に答える
3

関数内からグローバル環境を直接変更することはお勧めできません。通常は、値を返して、必要な場所にユーザーが追加できるようにする方がよいでしょう。(スティブが説明したように)。

ただし、公式の R 言語定義の例を次のように変更したように、ネストされた環境を使用することもできます。

fruitscollector <- function(){
  fruitslist <- NULL
  function(){
    answer <- as.integer(readline(prompt="How Many?: "))
    fruitslist <<- c(fruitslist, answer)
    fruitslist
  }
}

したがって、「fruitscollector」を最初に初期化すると、値を収集できる関数だけが返されます。

foo <- fruitscollector()

を使用するたびfooに、コレクションに値が追加されます (コレクション全体が返されます)。

foo()
foo()
# etc

fruitslistの親環境に保存される fooため、誤って削除できるグローバル環境にはありません。

編集

より一般的なアイデアは、メソッドとして関数を使用してオブジェクト (OOP で「オブジェクト」と呼ばれるものに多少似ています) を作成することです。

collector <- function(){
  stack <- NULL
  list(
    add = function(x) stack<<-c(stack, x),
    get = function() stack,
    empty = function() stack <<- NULL
  )
}

addメソッドはスタックに追加され、getメソッドはスタック全体を返し、emptyメソッドはそれを空にします。

foo <- collector()  # initialize
foo$get()  # NULL
foo$add(1)  # add 1 to the stack
foo$get()  # 1
foo$add(3)  # add 3 to the stack
foo$get()  # 1 3
foo$add(1:5) # etc...
于 2016-05-21T08:46:02.620 に答える