この単純な関数が機能しないのはなぜですか?

ニーラジ

最初に新しい変数を定義しx、次にxその本体内で(引数としてではなく)必要な関数を作成しました以下のコードを参照してください

x <- c(1,2,3)
f1 <- function() {
  x^2
}

rm(x)

f2 <- function() {
  x <- c(1,2,3)
  f1()
}

f(2)  
Error in f1() : object 'x' not found

を削除しxf2最初に定義xしてから実行する新しい関数を定義すると、f1オブジェクトxが見つかりませんでした。

なぜこれが機能しないのか、そしてこの問題をどのように克服できるのかを知りたかっただけです。x引数として名前になりたくありませんf1

これがどんな問題なのかわからないので、適切なタイトルを付けてください。

Rヨーダ

要するに:あなたは動的スコープを期待していますが、Rの字句スコープの犠牲者です:

  • 動的スコープ=コマンドの囲み環境は実行時に決定されます

  • 字句スコープ=コマンドの囲み環境は「コンパイル時」に決定されます

x現在の環境と親環境での変数のルックアップパスを理解するには、このコードを試してください。

これは、両方の関数が環境を共有していないことを示しているためxで定義されているf2ため、見つけることができません。

# list all parent environments of an environment to show the "search path"
parents <- function(env) {
  while (TRUE) {
    name <- environmentName(env)
    txt <- if (nzchar(name)) name else format(env)
    cat(txt, "\n")
    if (txt == "R_EmptyEnv") break
    env <- parent.env(env)
  }
}

x <- c(1,2,3)
f1 <- function() {
  print("f1:")
  parents(environment())
  x^2
}

f1()  # works
# [1] "f1:"
# <environment: 0x4ebb8b8> 
# R_GlobalEnv 
# ...

rm(x)

f2 <- function() {
  print("f2:")
  parents(environment())
  x <- c(1,2,3)
  f1()
}

f2()  # does not find "x"
# [1] "f2:"
# <environment: 0x47b2d18> 
# R_GlobalEnv
# ...
# [1] "f1:"
# <environment: 0x4765828> 
# R_GlobalEnv 
# ...

可能な解決策:

  1. x地球環境で宣言する(カプセル化が不足しているため、プログラミングスタイルが悪い)

  2. 関数パラメーターを使用します(これが関数の目的です)

  3. x呼び出しごとに常に同じ値がある場合、クロージャを使用しますf1(初心者向けではありません)。@JohnColemanからの他の回答を参照してください...

2.を使用することを強くお勧めします(パラメーターとしてxを追加します-なぜこれを避けたいのですか?)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

この単純なpostgresql関数呼び出しが機能しないのはなぜですか?

分類Dev

この単純なPHPpreg_match()関数が機能しないのはなぜですか?

分類Dev

この単純な構成が機能しないのはなぜですか?

分類Dev

この単純なenable_ifが機能しないのはなぜですか?

分類Dev

この単純な継承が機能しないのはなぜですか?

分類Dev

Django:なぜこの単純なタグが機能しないのですか?

分類Dev

このかなり単純な「if」が機能しないのはなぜですか?

分類Dev

この単純な比較がJavaScriptで正しく機能しないのはなぜですか?

分類Dev

この単純なhqlクエリが機能しないのはなぜですか?未分類のSQLException

分類Dev

この単純な物理学の自由落下コードが機能しないのはなぜですか

分類Dev

この単純なAngular.jsの例が機能しないのはなぜですか?

分類Dev

Laravelの単純なbelongsToの関係が機能しないのはなぜですか?

分類Dev

このjquery.inArrayが単純な文字列に対して機能しないのはなぜですか?

分類Dev

この単純な例でdatetime.strptimeが機能しないのはなぜですか?

分類Dev

この単純なToDoリストがAngularで機能しないのはなぜですか

分類Dev

この単純なJQueryセレクターがIOSで機能しないのはなぜですか?

分類Dev

単純な<scriptsrc = "..."> </ script>が機能しないのはなぜですか?

分類Dev

単純な「if」が機能しないのはなぜですか?PHP

分類Dev

type()関数がここで機能しないのはなぜですか?

分類Dev

この単純なCRONジョブが機能しないのはなぜですか?

分類Dev

この単純な条件式が機能しないのはなぜですか?

分類Dev

この単純なAngularJS ng-showが機能しないのはなぜですか?

分類Dev

この単純なJava forループが機能しないのはなぜですか?

分類Dev

この単純なAES暗号化が機能しないのはなぜですか?

分類Dev

この単純なロジックが機能しないのはなぜですか?

分類Dev

この単純なforループが期待どおりに機能しないのはなぜですか?

分類Dev

この単純なJavaScriptXOR暗号化アルゴリズムが機能しないのはなぜですか?

分類Dev

この単純なPHPログインスクリプトが機能しないのはなぜですか?

分類Dev

この単純なjQueryon clickイベントが機能しないのはなぜですか?

Related 関連記事

  1. 1

    この単純なpostgresql関数呼び出しが機能しないのはなぜですか?

  2. 2

    この単純なPHPpreg_match()関数が機能しないのはなぜですか?

  3. 3

    この単純な構成が機能しないのはなぜですか?

  4. 4

    この単純なenable_ifが機能しないのはなぜですか?

  5. 5

    この単純な継承が機能しないのはなぜですか?

  6. 6

    Django:なぜこの単純なタグが機能しないのですか?

  7. 7

    このかなり単純な「if」が機能しないのはなぜですか?

  8. 8

    この単純な比較がJavaScriptで正しく機能しないのはなぜですか?

  9. 9

    この単純なhqlクエリが機能しないのはなぜですか?未分類のSQLException

  10. 10

    この単純な物理学の自由落下コードが機能しないのはなぜですか

  11. 11

    この単純なAngular.jsの例が機能しないのはなぜですか?

  12. 12

    Laravelの単純なbelongsToの関係が機能しないのはなぜですか?

  13. 13

    このjquery.inArrayが単純な文字列に対して機能しないのはなぜですか?

  14. 14

    この単純な例でdatetime.strptimeが機能しないのはなぜですか?

  15. 15

    この単純なToDoリストがAngularで機能しないのはなぜですか

  16. 16

    この単純なJQueryセレクターがIOSで機能しないのはなぜですか?

  17. 17

    単純な<scriptsrc = "..."> </ script>が機能しないのはなぜですか?

  18. 18

    単純な「if」が機能しないのはなぜですか?PHP

  19. 19

    type()関数がここで機能しないのはなぜですか?

  20. 20

    この単純なCRONジョブが機能しないのはなぜですか?

  21. 21

    この単純な条件式が機能しないのはなぜですか?

  22. 22

    この単純なAngularJS ng-showが機能しないのはなぜですか?

  23. 23

    この単純なJava forループが機能しないのはなぜですか?

  24. 24

    この単純なAES暗号化が機能しないのはなぜですか?

  25. 25

    この単純なロジックが機能しないのはなぜですか?

  26. 26

    この単純なforループが期待どおりに機能しないのはなぜですか?

  27. 27

    この単純なJavaScriptXOR暗号化アルゴリズムが機能しないのはなぜですか?

  28. 28

    この単純なPHPログインスクリプトが機能しないのはなぜですか?

  29. 29

    この単純なjQueryon clickイベントが機能しないのはなぜですか?

ホットタグ

アーカイブ