小编Ari*_*man的帖子

do.call() 在没有默认参数的情况下的行为

这个问题是对之前提出了一个难题的答案的跟进。

上一个答案中的可重现示例:

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或类似...

arguments r do.call

5
推荐指数
1
解决办法
943
查看次数

devtools::load_all() 当函数 x 是加载包的一部分时“找不到函数 x”

我最近收到此错误消息:

> 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部分中 …

r devtools

5
推荐指数
1
解决办法
1287
查看次数

熔化/铸造不能一步解决的重塑问题有哪些?

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)

r reshape2

4
推荐指数
1
解决办法
495
查看次数

将参数传递给Compose'd函数?

我有一种情况,我想将参数传递给通过链接的函数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除了作为可爱键盘的挽歌之外,它不是很有用.

functional-programming r

4
推荐指数
1
解决办法
277
查看次数

如何强制旧版软件包安装在较新版本的R上?

我无法安装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安装旧版二进制包的一般机制(意识到可能存在错误)?

r

4
推荐指数
1
解决办法
6398
查看次数

读取固定宽度文件中相同列的倍数

请考虑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,较窄的代码是,等等. …

r stata

4
推荐指数
1
解决办法
295
查看次数

如何测试公式是否是片面的?

我需要测试一个公式是否是片面的(例如,~ 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)

有没有更好的办法?我担心有些类型的公式我不知道可以逃避这个测试.

r

4
推荐指数
1
解决办法
518
查看次数

使用R的doParallel包的多核计算是否使用更多内存?

我刚刚测试了一个带有和没有平行后端的弹性网.电话是:

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%,对吧?

因为我对这是否是预期的结果感兴趣,这与这个问题密切相关但不完全相同,但我会很好地关闭这个并将我的问题合并到那个(或标记为重复并指向这个,因为这有更多的细节)如果这是共识是什么:

新的doParallel封装的内存消耗极高

parallel-processing r machine-learning

4
推荐指数
1
解决办法
3328
查看次数

RSQLite中的因素

我一直无法找到有关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)

sqlite r rsqlite

4
推荐指数
1
解决办法
851
查看次数

将函数内容分配给变量以进行文本处理

我想将函数的内容作为文本分配给变量,以便我可以在其中查找各种模式.(实际上,我想分配每个函数的内容,以查找从其他函数调用每个函数的频率,但是一旦我可以为一个函数执行它,这很容易做到).

乍一看,这似乎很容易.这就是为什么在控制台中键入一个函数名称,这意味着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)

这里有诀窍吗?也许是一个我不了解的内部功能?

r data-mining

3
推荐指数
1
解决办法
178
查看次数