我认为一般来说使用%>%不会对速度产生明显影响.但在这种情况下,它运行速度慢了4倍.
library(dplyr)
library(microbenchmark)
set.seed(0)
dummy_data <- dplyr::data_frame(
id=floor(runif(10000, 1, 10000))
, label=floor(runif(10000, 1, 4))
)
microbenchmark(dummy_data %>% group_by(id) %>% summarise(list(unique(label))))
microbenchmark(dummy_data %>% group_by(id) %>% summarise(label %>% unique %>% list))
Run Code Online (Sandbox Code Playgroud)
没有管道:
min lq mean median uq max neval
1.691441 1.739436 1.841157 1.812778 1.880713 2.495853 100
Run Code Online (Sandbox Code Playgroud)
带管:
min lq mean median uq max neval
6.753999 6.969573 7.167802 7.052744 7.195204 8.833322 100
Run Code Online (Sandbox Code Playgroud)
为什么%>%在这种情况下会这么慢?有没有更好的方法来写这个?
我编写了一个使用devtools来包含内部数据的包:
devtools::use_data(.data, internal = T, overwrite = T)
Run Code Online (Sandbox Code Playgroud)
我最近更改了这些数据并重建了包.我想在另一台当前加载旧软件包的机器上升级该软件包:
detach('package:myPackage', unload=T)
remove.packages('myPackage')
install.packages(repos=NULL, 'myPackage.zip')
Run Code Online (Sandbox Code Playgroud)
我检查一下这些变化是否已经完成:
length(myPackage:::.data[[1]])
[1] 2169
Run Code Online (Sandbox Code Playgroud)
不是我期待的......也许重启会有所帮助?
Restarting R session...
length(myPackage:::.data[[1]])
[1] 2179
Run Code Online (Sandbox Code Playgroud)
这是预期的结果.
阅读分离的帮助表明它在某些情况下可能是片状的,例如:
如果在加载了命名空间的包上使用库,则会附加已加载的命名空间的导出.因此,分离和重新附加包可能不会刷新包的一些或所有组件,并且是不可取的.
我的情况是,我想彻底清除加载的包,以便我可以更新它.有没有办法在不重新启动R的情况下执行此操作?
编辑2016/10/28 - 使用下面的可重现示例进行更新
...
# setup package in temp dir
pkg_dir <- file.path(tempfile(), 'dummy.test.pkg')
dir.create(pkg_dir, recursive=T)
devtools::create(pkg_dir)
setwd(pkg_dir)
# read description
desc <- readChar('DESCRIPTION', file.size('DESCRIPTION'))
# create and build package v01
.testval <- c(1,2,3)
devtools::use_data(.testval, internal=T, overwrite=T)
v01 <- sub('\\d+\\.\\d+\\.\\d+\\.\\d+', '0.0.0.1', desc, perl=T)
writeChar(v01, 'DESCRIPTION')
bin01 <- …Run Code Online (Sandbox Code Playgroud) 如果foo <- list(),foo[[length(foo)+1]] <- bar当我真正想写的时候,我发现自己写了很多东西push(foo, bar).
同样地(尽管不那么频繁)bar <- foo[[length(foo)]]会更好bar <- pop(foo).
这是重复的变量名称杀死了我.考虑:
anInformative.selfDocumenting.listName[[length(anInformative.selfDocumenting.listName)+1]] <- bar
Run Code Online (Sandbox Code Playgroud)
编辑:
foo <- append(foo, bar) 不适合我
foo <- list()
for (i in 1:10) {
x <- data.frame(a=i, b=rnorm(1,0,1))
foo[[length(foo)+1]] <- x
}
str(foo)
Run Code Online (Sandbox Code Playgroud)
按预期提供10个对象的列表.
foo <- list()
for (i in 1:10) {
x <- data.frame(a=i, b=rnorm(1,0,1))
foo <- append(foo, x)
}
str(foo)
Run Code Online (Sandbox Code Playgroud)
给出了20个对象的列表.
有时使用ggplot我发现自己使用数据框,其中变量名实际上对应于我想要使用的美学.这会导致像这样的代码:
rect <- data.frame(xmin=1,xmax=10,ymin=1,ymax=10)
ggplot(rect, aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax))+geom_rect()
Run Code Online (Sandbox Code Playgroud)
感觉有点湿.
有没有办法避免这种重复?
来自?stat_summary。
fun.data:完整的摘要功能。应将数据帧作为输入,并将返回数据帧作为输出
我很难理解这一点。似乎我的摘要函数so.summary根本没有传递数据帧!
码:
set.seed(0)
so.example <- data.frame(
sampleID=rep(1:15)
, sales=runif(15, 0, 1)*1000
, revenue=runif(15, 0, 1)*10000
)
so.summary <- function(z) {
print(z)
data.frame(sales=median(z$sales), revenue=median(z$revenue))
}
ggplot(
so.example
, aes(x=sales, y=revenue)
) + geom_point() + stat_summary(fun.data=so.summary, geom='point', color='red')
Run Code Online (Sandbox Code Playgroud)
输出:
[1] 2672.207
Error in z$sales : $ operator is invalid for atomic vectors
Run Code Online (Sandbox Code Playgroud) 在一个函数中,我想改变语言环境,做一些事情,然后不改变它.因为副作用很差.
old_locale <- Sys.getlocale()
# do some stuff
Sys.setlocale(old_locale)
Run Code Online (Sandbox Code Playgroud)
但是,Sys.setlocale需要category和locale论证.
另一方面,Sys.getlocale()给我这个:
"LC_COLLATE=English_Australia.1252;LC_CTYPE=English_Australia.1252;LC_MONETARY=English_Australia.1252;LC_NUMERIC=C;LC_TIME=English_Australia.1252"
Run Code Online (Sandbox Code Playgroud)
好.我可以处理这个问题:
old_locale <- Sys.getlocale()
locale_key_values <- strsplit(strsplit(old_locale, ';')[[1]], '=')[[1]], '=')
locale_keys <- lapply(locale_key_values, getElement, name=1)
locale_values <- lapply(locale_key_values, getElement, name=2)
# do some stuff
mapply(Sys.setlocale, category=locale_keys, locale=locale_values)
Run Code Online (Sandbox Code Playgroud)
问题解决了!
......或者是吗?
Sys.setlocale(locale='C')
Run Code Online (Sandbox Code Playgroud)
Sys.getlocale()现在回来了"C"!这不适合我上面的键值解析器.
我突然意识到我对locales或Sys.getlocale()可能返回的字符串范围一无所知.
有谁知道保存和恢复语言环境状态的可靠方法?
我想融化 data.table 而不包含任何 ID 列。
dt <- data.table::data.table(iris)[1:10]
data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'))
Run Code Online (Sandbox Code Playgroud)
如果不指定 id.vars,所有非measure.vars 列都将被视为id.vars。这可以在事后通过仅从熔体中选择变量/值来处理。
例如,下面的代码产生我正在寻找的输出:
data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'))[,.(variable, value)]
Run Code Online (Sandbox Code Playgroud)
但我认为这应该可以在熔化呼叫本身内实现?我尝试过以下方法但没有成功。
data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'), id.vars=NULL)
data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'), id.vars=c())
data.table::melt(dt, measure.vars=c('Petal.Length', 'Petal.Width'), id.vars=list())
Run Code Online (Sandbox Code Playgroud)
从文档中:
如果 id.vars 和measure.vars 都丢失,则所有非数字/整数/逻辑列将被分配为id 变量,其余的将被分配为度量变量。如果仅提供 id.vars 或measure.vars 之一,则其余列将分配给另一列。id.vars 和measure.vars 都可以多次拥有同一列,并且同一列可以同时作为id 和measure 变量。
Melt.data.table 还接受 id 和measure变量的列表列。
r ×7
ggplot2 ×2
cardinality ×1
data.table ×1
devtools ×1
dplyr ×1
locale ×1
magrittr ×1
melt ×1
performance ×1