我想逐行生成一个数据帧,通过使用apply值列表中的一些风格和一个为每个值返回单行数据框的函数.作为一个玩具示例,假设我的价值观是i = 1:3我的:
f <- function(i) {
return(data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F))
}
Run Code Online (Sandbox Code Playgroud)
我一直在插科打诨sapply,lapply一帮转置等,但没有成功(例如,d = sapply(1:3, f)看起来很有希望,但似乎是我想要的转置,所以我想d = t(sapply(1:3,f)),除了它是一个矩阵,所以我试着接下来d = as.data.frame(t(sapply(1:3, f))),它看起来正确(它打印出来就像我想要的那样),但仍然是错误的,因为你会发现你是否尝试将其子集化,例如d[,1]实际上是一个列表).
最后我得到了这个,它有效:
d = apply(data.frame(i=1:3), 2, f)$i
Run Code Online (Sandbox Code Playgroud)
这给了我想要的框架:
img cached i
1 a FALSE 1
2 b FALSE 2
3 c FALSE 3
Run Code Online (Sandbox Code Playgroud)
是否有更好/更清洁的方式来表达上述内容?对我来说,这一切都让人感到非常愚蠢和过于复杂.
编辑:正如几位读者所提到的,这个"玩具示例"过于简单,实际上就是f(1:3)按照我的要求行事.实际功能是基于Web的度量仪表板的一部分,从各种数据库表中提取数据,并生成我打算缓存的中等复杂图(大多数时候它们变化相对较慢).我想相关部分是该函数通常需要几个参数,而这些参数不是一个简单的序列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)
}
Run Code Online (Sandbox Code Playgroud)
其中queryExec构建查询,执行查询并检索结果,gkey()根据其参数计算哈希键,getFromCacheOrPlot()使用key构建文件名(.png图像),如果存在则从缓存中检索它,否则生成它.它还返回一个data.frame,其中一行为我们提供文件名,一个html <img=...>blurb显示它,绘图是否在缓存中,以及哪些参数用于绘图.
所有这些都用在wiki系统的插件中,某些页面有十几个或更多的图表.
do.call(rbind, lapply(i, f)) 会做你要问的......但是会这样做:
data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F)
Run Code Online (Sandbox Code Playgroud)
如:
f(i)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5456 次 |
| 最近记录: |