5

更新:以前のタイトルはIs there any specific way to pass data frame as an argument to a function?、ここの優秀な人によると、正しい質問ではありませんでした。元の投稿は以下です。

で次の関数を実行したとき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 は、オブジェクトの内容全体を関数の引数にコピーすることを意味する値渡しだと思いました。しかし、私は完全に正しくなかったようです。誰が何が起こっているのか説明できますか?

4

2 に答える 2

5

(ハッキーな)回避策はdataLme、グローバル環境に割り当てることです。どこでeffect()見つけることができますか:

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)
于 2013-04-08T18:00:33.707 に答える