apply
値のリストのフレーバーと、各値に対して単一行のデータフレームを返す関数を使用して、行ごとにデータフレームを生成したいと考えています。おもちゃの例として、私の価値観が次のとおりi = 1:3
であるとします。
f <- function(i) {
return(data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F))
}
私はsapply
、lapply
、転置などの束をいじっていますが、成功していません (たとえば、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 も返します。
これらはすべてウィキ システムのプラグインで使用され、特定のページには数十以上のプロットがあります。