2013-04-08 8 views
5

更新:前のタイトルはIs there any specific way to pass data frame as an argument to a function?でしたが、ここでは華麗な人によれば正しい質問ではありませんでした。元の投稿は以下です。R関数の中でエフェクトプロットを実行する方法

私はsomefunc(sleepstudy)と機能を以下走っ、

somefunc<-function (dataLme) 
{ 
library(effects) 
library(lme4) 

fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), dataLme, 
     REML = 0, verbose = TRUE) 

plot(effect("Days",fm8)) 
} 

私はエラーを得ました。

Error in plot(effect("Days", fm8)) : 
    error in evaluating the argument 'x' in selecting a method for function 'plot': Error in is.data.frame(data) : object 'dataLme' not found 

しかし、私は手動で

library(effects) 
library(lme4) 
fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), sleepstudy, 
    REML = 0, verbose = TRUE) 
plot(effect("Days",fm8)) 

を実行する場合、私はすべてのエラーを取得できませんでした。

私はRが値渡しだと思ったのは、オブジェクトの内容全体を関数の引数にコピーすることを意味していました。しかし、私はまったく正しいとは思われませんでした。誰でも何が起こっているのか説明できますか?

+3

私は問題がセマンティクスを渡しRの引数ではないと思います...安定lme4またはnlmeため開発lme4ためeval(cl,envir=environment(formula(mod)))作品に関連するeval(cl)ラインを変更ではなく、私が考える問題はeffect'は 'ということです間違った場所でモデルフィッティングコールを '評価する 'ことを試みます。少なくとも、関数内で実行すると動作しない場所。 @RicardoSaporta Days。 – joran

+0

ごめんなさい。私は私の質問にそれを修正した。ありがとう! –

+0

@ヨランよ。あなたはそれをどのように速く把握しましたか? :-) しかたがない。私はそれが今、著者に連絡する時だと思う。ご協力いただきありがとうございます! –

答えて

5

A(ハック)回避策はeffect()はそれを見つけることができるようになります地球環境へdataLmeを割り当てることです:

library(effects) 
library(lme4) 

somefunc <- function (dataLme) { 
    ## Assign to a symbol that's unlikely to be in use in .GlobalEnv 
    ## (and make sure this function cleans up after itself!) 
    assign(".TeMpVaR", dataLme, envir=globalenv()) 
    on.exit(rm(.TeMpVaR, envir=globalenv())) 

    fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), .TeMpVaR, 
     REML = 0, verbose = TRUE)  
    plot(effect("Days",fm8)) 
} 

somefunc(sleepstudy) 
+0

優秀!どうもありがとう。 –

+0

@トーマス - 私は改良されたソリューションで編集しました。 –

+0

何らかの理由で、新しいアップデートで同じエラーが発生します。 –

2

これは部分的にしか答えですが、私は私のテスト手順を文書化したかったです。私は主に、lme4パッケージではなく、effectsパッケージで問題が発生していることを主に示したいと考えていました(このような問題の多くは開発バージョンlme4で修正されていますが、私のシステムでlme4.0としてインストールの安定版、...)

library("effects") 

showpkgs <- function() names(sessionInfo()$otherPkgs) 
somefunc<-function (dataLme, pkg="nlme") { 
    require(pkg,character.only=TRUE) 
    on.exit(detach(paste("package",pkg,sep=":"),unload=TRUE,character.only=TRUE)) 
    if (pkg=="nlme") { 
     fm8 <- lme(Reaction ~ 1 + Days,random=~Days|Subject, dataLme) 
    } else { 
     fm8 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject), dataLme, REML = 0) 
    } 
    plot(effect("Days",fm8)) 
} 

に固執エラーは、我々は安定したlme4を使用するかどうか、開発lme4、または古いnlmeパッケージ

data("sleepstudy",package="lme4") 
showpkgs() 
somefunc(sleepstudy) ## nlme 
showpkgs() ## warning about unloading nlme namespace due to glmmADMB dep. (??) 
somefunc(sleepstudy,pkg="lme4.0") ## lme4-stable 
showpkgs() ## failure to remove Matrix/warning message 
somefunc(sleepstudy,pkg="lme4") ## lme4-devel 
showpkgs() ## leaves RcppEigen, Rcpp loaded as well 
を発生します

私はeffectsパッケージを少し見ましたが、簡単な普遍的な修正はすぐには分かりません。

関連する問題