0

私は関数を書いていますが、いくつかの問題があります。私の関数は新しい変数を作成しません。それを実行した後、実行したことがないかのようにエラーも変更もありません。関数の前のコードは問題なく動作し、引数を直接 (コードの関数の側面をバイパスして) コードに渡すと、問題なく実行されます。

私が欠けていると思うものはありますか?私はこれを 2 日間見ていて、試すアイデアが尽きてしまいました。どんな提案でも大歓迎です!

path <- "C:/Documents/Data"
readFile <- paste(path,"/opps.csv",sep="")
oppsQty <- read.csv(file=readFile,sep=",")

oppsQty$Line.Created.date <- as.Date(as.character(oppsQty$Line.Created),
                                     "%m/%d/%Y")

opQty002.0084.01 <- oppsQty[oppsQty$Part=="002-0084-01",]

 productNumberData <- function(nameNum,prodNum){
    # CREATING YEAR VARIABLE #
    year2009 <- ifelse((nameNum$Line.Created.date <= 
                        as.Date("12/30/2009","%m/%d/%Y")),"2009","0")
    year2010 <- ifelse((nameNum$Line.Created.date > 
                        as.Date("12/30/2009","%m/%d/%Y")&
                        nameNum$Line.Created.date <= 
                        as.Date("12/30/2010","%m/%d/%Y")),"2010",year2009)
    year2011 <- ifelse((nameNum$Line.Created.date > 
                        as.Date("12/30/2010","%m/%d/%Y")&
                        nameNum$Line.Created.date <= 
                        as.Date("12/30/2011","%m/%d/%Y")),"2011",year2010)
    nameNum$line.YEAR <- ifelse((nameNum$Line.Created.date > 
                                as.Date("12/30/2011","%m/%d/%Y")&
                                nameNum$Line.Created.date <= 
                                as.Date("12/30/2012","%m/%d/%Y")),"2012",year2011)
 }
 productNumberData(opQty002.0084.01,"002-0084-01")
 #opQty002.0084.01$line.YEAR does not exist
4

1 に答える 1

1

ここに表示されているのは、スコーピングと呼ばれるものの結果です。Rを含む適切なプログラミング言語では、変数はグローバルに有効ではありません。代わりに、変数は特定のスコープに存在します。作成している変数は、関数のスコープの一部です。したがって、それを使用しようとしている関数の外で見つからないため、エラーが発生します。R のスコープ規則では、関数外の変数を参照できます。関数外の変数は、関数のスコープ内にその名前の変数がない場合にのみ使用されます。

スコープを設定すると、より大きな R スクリプト内のコード間の依存関係が軽減されます。このようにして、関数内のコードが他の関数に望ましくない副作用を引き起こす可能性ははるかに低くなります。

私が使用する解決策は、作成したすべてのオブジェクトをより大きなデータ構造 (おそらくlist. コードは次のようになります。

spam = function(object_in) {
  A = f(object_in)
  B = g(object_in)
  list(A, B)
 }
result = spam(obj)
result[["A"]]
于 2012-06-21T21:02:15.417 に答える