上一个答案中的可重现示例:
Models <- list( lm(runif(10)~rnorm(10)),lm(runif(10)~rnorm(10)),lm(runif(10)~rnorm(10)) )
lm1 <- lm(runif(10)~rnorm(10))
library(functional)
# This works
do.call( Curry(anova, object=lm1), Models )
# But so does this
do.call( anova, Models )
Run Code Online (Sandbox Code Playgroud)
问题是为什么do.call(anova, Models)工作正常,正如@Roland 指出的那样?
方差分析的签名是 anova(object, ...)
anova调用UseMethod, which should* call anova.lmwhich should call anova.lmlist,其第一行是objects <- list(object, ...),但object在该公式中不存在。
我唯一可以猜测的是,这do.call可能不仅填写省略号,而且填写所有没有默认值的参数,并为省略号留下任何额外的内容?如果是这样,记录在哪里,因为它对我来说绝对是新的!
* 这本身就是一个线索——如果第一个参数未指定,如何UseMethod知道调用anova.lm?没有anova.list方法anova.default或类似...
我最近收到此错误消息:
> load_all(file.path(.db,"R-projects","taRifx.geo"))
Loading taRifx.geo
Error in eval(expr, envir, enclos) : could not find function "Polygons"
Run Code Online (Sandbox Code Playgroud)
该文件夹是我的本地副本:https : //github.com/gsk3/taRifx.geo
Polygons是 的一部分sp,并sp已加载:
> Polygons
function (srl, ID)
{
stopifnot(is.list(srl))
stopifnot(length(srl) > 0)
if (any(sapply(srl, function(x) !is(x, "Polygon"))))
stop("srl not a list of Polygon objects")
if (missing(ID))
stop("Single ID required")
if (length(ID) != 1)
stop("Single ID required")
ID <- as.character(ID)
stopifnot(nchar(ID) > 0)
res <- .Call(Polygons_c, srl, ID)
res
}
<environment: namespace:sp>
Run Code Online (Sandbox Code Playgroud)
sp也在包的Depends部分中 …
reshape2是一个允许强大的数据转换数组的包,通过它的两部分熔化/铸造方法。然而,像所有工具一样,它嵌入了限制它可以处理的情况的假设。
哪些数据重塑问题reshape2无法以当前形式处理?
理想的答案将包括:
reshape2)例子
“宽”数据在面板应用中很常见。
melt.wide <- function(data, id.vars, new.names, sep=".", variable.name="variable", ... ) {
# Guess number of variables currently wide
colnames(data) <- sub( paste0(sep,"$"), "", colnames(data) )
wide.vars <- colnames(data)[grep( sep, colnames(data) )]
n.wide <- str_count( wide.vars, sep )
stopifnot(length(new.names)==unique(n.wide))
# Melt
data.melt <- melt(data,id.vars=id.vars,measure.vars=wide.vars,...)
new <- stack.list(str_split(data.melt$variable,sep))
colnames(new) <- c(variable.name,new.names)
data.melt <- subset(data.melt,select=c(-variable))
cbind(data.melt,new)
}
choice.vars <- colnames(res)[grep("_",colnames(res))]
melt.wide( subset(res,select=c("WorkerId",choice.vars)), id.vars="WorkerId", new.names=c("set","option"), sep="_")
Run Code Online (Sandbox Code Playgroud)
新函数返回一个熔化的对象,然后可以是*cast.
数据在哪里:
so <- …Run Code Online (Sandbox Code Playgroud) 我有一种情况,我想将参数传递给通过链接的函数Compose.我意识到我可以在参数中使用Curry,但我希望得到的函数比这更灵活.这是一个简单的测试用例来显示问题:
> library(functional)
> f <- function(x, scale) x^2*scale
> g <- function(y, shift) sqrt(y)+shift
> h <- Compose(f,g)
> h(1)
Error in x^2 * scale : 'scale' is missing
> h(1, scale=1, shift=0)
Error in Reduce(function(x, f) f(x), fs, ...) :
unused argument(s) (scale = 1, shift = 0)
Run Code Online (Sandbox Code Playgroud)
有没有办法使用Compose它允许结果函数在被调用时仍然允许参数? ?Compose除了作为可爱键盘的挽歌之外,它不是很有用.
我无法安装proj4string到我当前版本的R(2.15.1)中:
Warning message:
package ‘proj4string’ is not available (for R version 2.15.1)
Run Code Online (Sandbox Code Playgroud)
我认为这是因为2.15.1相当新,而且包还没有更新.是否存在强制R安装旧版二进制包的一般机制(意识到可能存在错误)?
请考虑Stata .dct文件中的以下几行,该文件为Stata定义如何读取此固定宽度的ASCII文件(可以使用任何平台上的任何ZIP软件解压缩):
start type varname width description
_column(24) long rfv1 %5f Patient's Reason for Visit #1
_column(29) long rfv2 %5f Patient's Reason for Visit #2
_column(34) long rfv3 %5f Patient's Reason for Visit #3
_column(24) long rfv13d %4f Patient's Reason for Visit #1 - broad
_column(29) long rfv23d %4f Patient's Reason for Visit #2 - broad
_column(34) long rfv33d %4f Patient's Reason for Visit #3 - broad
Run Code Online (Sandbox Code Playgroud)
基本上,此ASCII文件的每一行中的第24到第39个字符如下所示:
AAAAaBBBBbCCCCc
Run Code Online (Sandbox Code Playgroud)
在第一个宽泛的代码所在的地方AAAA,由于同样的原因AAAAa,较窄的代码是,等等. …
我需要测试一个公式是否是片面的(例如,~ a而不是a~b).
现在我正在做这样的事情:
test <- list( ~ a + b, a ~ b + c, b + c ~ a )
isOneSided <- function(form) length(form)==2 && sum(grepl("~",form))==1
> sapply(test,isOneSided)
[1] TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?我担心有些类型的公式我不知道可以逃避这个测试.
我刚刚测试了一个带有和没有平行后端的弹性网.电话是:
enetGrid <- data.frame(.lambda=0,.fraction=c(.005))
ctrl <- trainControl( method="repeatedcv", repeats=5 )
enetTune <- train( x, y, method="enet", tuneGrid=enetGrid, trControl=ctrl, preProc=NULL )
Run Code Online (Sandbox Code Playgroud)
我在没有注册并行后端的情况下运行它(并%dopar%在train调用完成时收到警告消息),然后再注册一个注册7个内核(8个).第一次运行需要529秒,第二次运行需要313次.但是第一次运行最多需要3.3GB内存(由Sun集群系统报告),第二次采用22.9GB.我有30GB的RAM,这个任务只会变得更加复杂.
问题:1)这是并行计算的一般属性吗?我以为他们共享记忆.... 2)还有一种解决方法,同时还在使用enet内部train?如果doParallel是问题,是否还有其他我可以使用的架构 - 不%dopar%,对吧?
因为我对这是否是预期的结果感兴趣,这与这个问题密切相关但不完全相同,但我会很好地关闭这个并将我的问题合并到那个(或标记为重复并指向这个,因为这有更多的细节)如果这是共识是什么:
我一直无法找到有关RSQLite如何处理因素的文档.从快速测试(见下文)看,它们看起来像是转换为角色.
问题1:有没有办法将它们作为因素保存?我可以想到一些kludgy方式(主要涉及.Rdata存储因子级别的单独的表或文件),但似乎应该有一个标准,因此更易于维护的方式.
问题2:如果不是RSQLite,比其他一些数据库或类似数据库的包?我的用例很简单:附加一堆大的(2-5mm行X 550列)data.frames,因为每个都被处理以构建一个巨大的数据库,然后能够只选择我想从该数据库中带来的行进入data.table并继续努力.
library(RSQLite)
# Create
db <- dbConnect( SQLite(), dbname="~/temp/test.sqlite" )
# Write test
set.seed(1)
testDat <- data.frame(x=runif(1000),y=runif(1000),g1=sample(letters[1:10],1000,replace=TRUE),g2=rep(letters[1:10],each=100),g3=factor( sample(letters[1:10],1000,replace=TRUE) ))
if(dbExistsTable(db,"test")) dbRemoveTable(db,"test")
dbWriteTable( conn = db, name = "test", value = testDat, row.names=FALSE )
# Read test
testRecovery <- dbGetQuery(db, "SELECT * FROM test")
testSelection <- dbGetQuery(db, "SELECT * FROM test WHERE g3=='h' OR g3=='e' ")
# Close
dbDisconnect(db)
Run Code Online (Sandbox Code Playgroud) 我想将函数的内容作为文本分配给变量,以便我可以在其中查找各种模式.(实际上,我想分配每个函数的内容,以查找从其他函数调用每个函数的频率,但是一旦我可以为一个函数执行它,这很容易做到).
乍一看,这似乎很容易.这就是为什么在控制台中键入一个函数名称,这意味着print.function应该告诉我如何做到这一点:
> print.function
function (x, useSource = TRUE, ...)
.Internal(print.function(x, useSource, ...))
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)
失败.那么如果我只是将函数内容分配给变量并将它们强制转换为字符呢?
fxn_names <- apropos(".+")
fxns <- lapply(fxn_names,get)
as.character(fxns[[1]])
Error in as.character(fxns[[1]]) :
cannot coerce type 'builtin' to vector of type 'character'
Run Code Online (Sandbox Code Playgroud)
这里有诀窍吗?也许是一个我不了解的内部功能?