0

一度に複数の data.frames に別の関数を適用できる関数を作成しようとしています。data.frames には DATA_1、DATA_2 などの名前が付けられ、変数「actioncol」は変更する必要がある列を示します。これまでの私のコードは次のとおりです。

gsubFUN <- function(name, actioncol, ...){
  df.vec <- ls(pattern =  paste("name", "*", sep="_"), envir=.GlobalEnv)
  for(ii in 1:length(df.vec)){
  DATA <- get(df.vec[ii])
  DATA[,actioncol] <- gsub(pattern.vec[ii], replace.vec[ii], DATA[,actioncol])
  assign(paste(name, ii, sep = "_"),DATA, envir = .GlobalEnv)    
  }
}

私のコードがかなり混乱している可能性があることは承知していますが、機能します。外側の関数で data.frames にも (gsub だけでなく) 他の関数を適用したいので、変数に置き換えてみました。

multiDfFUN <- function(name, actioncol, FUN, ...){
  df.vec <- ls(pattern =  paste(name, "*", sep="_"), envir=.GlobalEnv)
  for(ii in 1:length(df.vec)){
  DATA <- get(df.vec[ii])
  DATA[,actioncol] <- match.fun(FUN)
  assign(paste(name, ii, sep = "_"),DATA, envir = .GlobalEnv)    
  }
}

multiDfFUN(name="audi", actioncol="color", FUN=gsub, pattern=pattern.vec[ii],
       replacement=replace.vec[ii], x=DATA[,actioncol])

ただし、これはエラー メッセージを返すようになりました。

error in rep(value, length.out = n) : 
   attempt to replicate an object of type 'closure'

これも意味がわかりません。ウェブで検索しても役に立ちません。関数を呼び出すときの引数 pattern、replacement & x がこの理由でしょうか? 誰かがこの問題について私を啓発したり、簡単な解決策を教えてくれたりしてくれたら本当にうれしいです (もしあれば)。

よろしくお願いします。

4

2 に答える 2

1

この行:

DATA[,actioncol] <- match.fun(FUN)

... データフレーム内のアイテムに関数 (関数名ではない) を割り当てようとしています。それでは成功しません。そして、次のように書きます。

assign(paste(name, ii, sep = "_"),DATA, envir = .GlobalEnv)    

その努力は、R の好ましいプログラミング スタイルとはまったく逆です。関数本体内から GlobalEnv への代入は、そのエラー メッセージの意味を知っている人だけが試みるべきです。match.fun関数を返すので、次のようなことをしたいと思うでしょう:

 DATA[,actioncol] <-  match.fun(FUN)( DATA[,actioncol] )
 return(DATA)

そして、次のように呼び出します。

DATAnew <- multiDfFUN(name="audi", actioncol="color", FUN=gsub, 
                      pattern=pattern.vec[ii],
                      replacement=replace.vec[ii], x=DATA[,actioncol])

使用するサンプル データがないため、これは検証されていない推測として残します。

証拠に追加された注:

 fortunes::fortune("understand why")

割り当て機能を使用する必要があるのは、割り当て機能を使用してはならない理由を完全に理解している人だけです。-- Greg Snow R-help (2009 年 7 月)

于 2013-07-18T22:47:51.117 に答える
1

試験でかなり忙しかったので、今答えているところです。DWin の提案は、実際に機能を意図したとおりに機能させるのに役立ちました。

また、あなたのすべての警告attachを考慮しました。しかし、前に述べたように、私は明示的に使用するように求められた課題のためにこのコードを作成しました。だから、これは私が最終的に得たものです:

MultiDfFUN <- function(df.vec, col.name, col.new="new", df.name, 
                       FUN, overwrite=F, ...){
 df.list <- list(NULL)
 for(ii in 1:length(df.vec)){
    DATA <- get(df.vec[ii])
    DATA[,col.new] <- FUN(DATA[,col.name],...)

    if(overwrite == TRUE){
      assign(paste(df.name, ii, sep = "_"),DATA, envir = .GlobalEnv)
    }else{
      df.list[[ii]] <- DATA[,col.new]
    }
  }
  if(overwrite == FALSE) return(df.list)
}
于 2013-07-25T17:45:59.637 に答える