7

apply値のリストのフレーバーと、各値に対して単一行のデータフレームを返す関数を使用して、行ごとにデータフレームを生成したいと考えています。おもちゃの例として、私の価値観が次のとおりi = 1:3であるとします。

f <- function(i) {
    return(data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F))
}

私はsapplylapply、転置などの束をいじっていますが、成功していません (たとえば、d = sapply(1:3, f)有望に見えますが、私が望むものの転置のように見えるのでd = t(sapply(1:3,f))、行列であることを除いて、 を試しました。したがって、試しましたnext d = as.data.frame(t(sapply(1:3, f)))、これは正しいように見えます (私が望むものと同じように出力されます) が、サブセット化しようとするd[,1]と、実際にはリストであるなどがわかるため、まだ間違っています)。

最後に、これを取得しました。これは機能します:

d = apply(data.frame(i=1:3), 2, f)$i

それは私が欲しかったフレームを私に与えます:

  img cached i
1   a  FALSE 1
2   b  FALSE 2
3   c  FALSE 3

上記を表現するためのより良い/よりクリーンな方法はありますか? それはすべてかなり下品で、私には過度に複雑に感じます.


編集:何人かの読者が言及したように、この「おもちゃの例」は明らかに単純すぎて、実際にf(1:3)私が要求しているように見えるだけです。実際の関数は、Web ベースのメトリック ダッシュボードの一部であり、さまざまな DB テーブルからデータを取得し、キャッシュする予定の適度に複雑なプロットを作成します (ほとんどの場合、比較的ゆっくりと変化します)。関連する部分は、関数が通常いくつかの引数を取り、それらの引数が単純なシーケンスではないことだと思います1:n。それでは、この例をもう少し現実的なものに書き直してみましょう。

library(digest)
gkey   <- function(...) {
  args <- list(...)
  return(digest(paste(args,sep=".",collapse=".")));
}

f <- function(conn, table, checknew.query, plot.query, plot.fun, params) {
  latest.data = queryExec(conn, table, checknew.query, params)
  key = gkey(table, latest.data, plot.query, plot.fun, params)
  out = getFromCacheOrPlot(key, conn, table, plot.query, plot.fun, params)
  return(out)
}

wherequeryExecは、クエリを作成して実行し、結果を取得し、gkey()そのパラメーターに基づいてハッシュ キーを計算し、getFromCacheOrPlot()を使用しkeyてファイル名 (.png 画像) を作成し、存在する場合はキャッシュから取得し、そうでない場合は生成します。<img=...>また、ファイル名、それを表示するための html の宣伝文句、プロットがキャッシュ内にあるかどうか、およびプロットに使用されたパラメータを示す1 つの行を含む data.frame も返します。

これらはすべてウィキ システムのプラグインで使用され、特定のページには数十以上のプロットがあります。

4

2 に答える 2

8

do.call(rbind, lapply(i, f))あなたが求めていることをします...しかしそうします:

data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F)

次のように:

f(i)
于 2013-01-15T22:31:52.087 に答える
3

これはどうですか?apply関数のフレーバーを使用する必要はありません

foo <- function(x){
  i <- seq_len(x)
  data.frame(img=letters[i], cached=FALSE, i=i, stringsAsFactors=F)
}


  foo(5)
  img cached i
1   a  FALSE 1
2   b  FALSE 2
3   c  FALSE 3
4   d  FALSE 4
5   e  FALSE 5
于 2013-01-15T19:49:31.197 に答える