7

save()オブジェクトを保存する前に、欠落しているディレクトリを作成するように R でオーバーライドしようとしています。省略記号メソッドを使用して、ある関数から別の関数にオブジェクトを渡すのに問題があります。

私の例:

save <- function(...,file){ #Overridden save()
  target.dir <- dirname(file) #Extract the target directory
  if(!file.exists(target.dir)) {
      #Create the target directory if it doesn't exist.
      dir.create(target.dir,showWarnings=T,recursive=T)
  }
  base::save(...,file=file.path(target.dir,basename(file)))
}

fun1 <- function(obj) {
  obj1 <- obj + 1
  save(obj1,file="~/test/obj.RData")
}

fun1(obj = 1)

上記のコードを実行すると、次のエラーが発生します。

Error in base::save(..., file = file.path(target.dir, basename(file))) : 
object ‘obj1’ not found

オブジェクト 'obj1' がカスタム save() 関数内に存在しないことが問題であることに気付きましたが、それを fun1 から base::save に渡す方法をまだ理解していません。

私が試してみました:

base::save(parent.frame()$...,file=file.path(target.dir,basename(file)))

と:

base::save(list=list(...),file=file.path(target.dir,basename(file)))

成功しませんでした。

助言がありますか?

4

1 に答える 1

7

親の環境を 'base::save' に指定する必要があります:

save <- function(...,file){ #Overridden save()
  target.dir <- dirname(file) #Extract the target directory
  if(!file.exists(target.dir)) {
    #Create the target directory if it doesn't exist.
    dir.create(target.dir,showWarnings=T,recursive=T)
  }
  base::save(...,file=file.path(target.dir,basename(file)),envir=parent.frame())
}

base::save 呼び出しに追加されたパラメーターに注意してください。

fun1 <- function(obj) {
  obj1 <- obj + 1
  save(obj1,file="~/test/obj.RData")
}

さらに、'=' を使用してパラメーター名を指定します。

fun1(obj = 1)
于 2012-06-10T18:48:26.343 に答える