2017-12-01 5 views
2

ランダムなデータとこれら2つの関数を取ります。関数を使って関数をcor.testに渡す

data = data.frame(x=c(1,2,3,4,5,5), y=c(1,2,3,4,5,5)) 

test_fun1 <- function(data, formula){ lm(formula = formula, data = data) } 
test_fun2 <- function(data, formula){ cor.test(formula = formula, data = data) } 

lm期待どおりです。

test_fun1(data = data, formula= x~y) 

でも、私はcor.testと同じことをすることはできません。これは失敗します。

test_fun2(data = data, formula= ~x+y)

直接それだけで正常に動作します:

cor.test(formula = ~x+y, data = data)

を私はいくつかのスコープに問題がある可能性が読んだものから。 渡された数式を見つけることができません。エラーは "エラー:タイプ 'クロージャのオブジェクトはサブセット化できません"ですが、これはformulaが見つからないため、formulaという名前の関数を使用しようとしているためです。

渡された関数を見つけるにはどうすればよいですか?

答えて

3

機能にバグがある可能性があります。この回避策を試してください:これはtest_fun3の呼び出し元の、すなわち、その中でのtest_fun3に引数を代用して、親フレームで実行されます

test_fun3 <- function(data, formula) { 
    eval.parent(substitute(cor.test(formula = formula, data = data))) 
} 

1

別の解決策:

test_fun2 <- function(data, formula) { 
    environment(formula) <- environment() 
    cor.test(formula = formula, data = data) 
} 

test_fun2(data = data, formula= ~x+y) 

#   Pearson's product-moment correlation 
# 
# data: x and y 
# t = 1.7596, df = 4, p-value = 0.1533 
# alternative hypothesis: true correlation is not equal to 0 
# 95 percent confidence interval: 
# -0.3255130 0.9583575 
# sample estimates: 
#  cor 
# 0.6605476 
+0

cor.testがあるため動作するようになっている方法についていくつかの質問があり、その後、LMのように動作するようになっている場合cor.testは本当にLMが見えます注意してくださいと言うのではなく?数式環境内の変数が見つからない場合はその変数を検索し、その場合はその環境を破棄することはできません。一般的なケースではこれはうまくいくはずです。 –

+0

ここで、 'test_fun4'が環境を破壊するバージョンである例を示します。 'fo < - 〜X + Y;環境(fo)< - new.env();環境(fo)$ Y < - 1:5; dd < - data.frame(X = 1:5); test_fun(data = dd、formula = fo) ' –

+0

@ G.Grothendieck [OK]を、私はその点を理解しています。あなたの重要な説明をありがとうございました。 –

関連する問題