学习如何编写用于R的C代码的最佳资源是什么?我知道R扩展的系统和外语接口部分,但我发现它很难.编写用于R的C代码有哪些好的资源(在线和离线)?
为了澄清,我不想学习如何编写C代码,我想学习如何更好地集成R和C.例如,我如何从C整数向量转换为R整数向量(反之亦然)或者从C标量到R向量?
假设我有一个包含一些棒球运动员的数据表:
library(plyr)
library(data.table)
bdt <- as.data.table(baseball)
Run Code Online (Sandbox Code Playgroud)
对于每个玩家(由id给出),我想找到与他们玩最多游戏的年份相对应的行.这在plyr中很简单:
ddply(baseball, "id", subset, g == max(g))
Run Code Online (Sandbox Code Playgroud)
data.table的等效代码是什么?
我试过了:
setkey(bdt, "id")
bdt[g == max(g)] # only one row
bdt[g == max(g), by = id] # Error: 'by' or 'keyby' is supplied but not j
bdt[, .SD[g == max(g)]] # only one row
Run Code Online (Sandbox Code Playgroud)
这有效:
bdt[, .SD[g == max(g)], by = id]
Run Code Online (Sandbox Code Playgroud)
但它比plyr快30%,这表明它可能不是惯用语.
如何使用data.table 执行半连接?半连接类似于内部连接,除了它只返回X的列(不是Y的列),并且不重复X的行以匹配Y的行.例如,以下代码执行内部连接加入:
x <- data.table(x = 1:2, y = c("a", "b"))
setkey(x, x)
y <- data.table(x = c(1, 1), z = 10:11)
x[y]
# x y z
# 1: 1 a 10
# 2: 1 a 11
Run Code Online (Sandbox Code Playgroud)
半连接只会返回 x[1]
检测R包中的性能回归有什么好的工作流程?理想情况下,R CMD check当我在代码中引入显着的性能回归时,我正在寻找可以集成的东西.
一般来说什么是好的工作流程?还有哪些其他语言提供的好工具 它是可以建立在最高单元测试上的,还是通常单独完成的?
哪些R包可以很好地利用S4类?我正在寻找适当使用S4的软件包(即当底层问题的复杂性需要时),编写得很好并且记录良好(这样你就可以阅读代码并了解正在发生的事情).
我很感兴趣,因为我很快就会教S4,我想让学生在实践中找到很好的例子,这样他们就可以阅读代码来帮助他们学习.
考虑以下简单功能:
f <- function(x, value){print(x);print(substitute(value))}
Run Code Online (Sandbox Code Playgroud)
争论x最终会被评估print,但value绝不会.所以我们可以得到这样的结果:
> f(a, a)
Error in print(x) : object 'a' not found
> f(3, a)
[1] 3
a
> f(1+1, 1+1)
[1] 2
1 + 1
> f(1+1, 1+"one")
[1] 2
1 + "one"
Run Code Online (Sandbox Code Playgroud)
一切都如预期的那样.
现在考虑替换函数中的相同函数体:
'g<-' <- function(x, value){print(x);print(substitute(value))}
Run Code Online (Sandbox Code Playgroud)
(单引号应该是花哨的引号)
我们来试试吧:
> x <- 3
> g(x) <- 4
[1] 3
[1] 4
Run Code Online (Sandbox Code Playgroud)
到目前为止没什么异常的......
> g(x) <- a
Error: object 'a' not found
Run Code Online (Sandbox Code Playgroud)
这是出乎意料的.名称a应打印为语言对象.
> g(x) …Run Code Online (Sandbox Code Playgroud) 如何显示unicode字符串,例如:
x <- "•"
Run Code Online (Sandbox Code Playgroud)
使用其转义的等价物?
y <- "\u2022"
identical(x, y)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
(我希望能够这样做,因为CRAN包必须只包含ASCII,但有时你想在错误信息中使用unicode或类似的)
许多期刊要求提交盲文版本的论文.盲目版本通常会删除:
如何在不手动操作的情况下创建手稿的盲版?
如何从数据框中有效地提取分组常量列?我在下面包含了一个plyr实现,以准确地说明我正在尝试做什么,但它很慢.我怎样才能尽可能高效地做到这一点?(理想情况下,根本不分割数据帧).
base <- data.frame(group = 1:1000, a = sample(1000), b = sample(1000))
df <- data.frame(
base[rep(seq_len(nrow(base)), length = 1e6), ],
c = runif(1e6),
d = runif(1e6)
)
is.constant <- function(x) length(unique(x)) == 1
constant_cols <- function(x) head(Filter(is.constant, x), 1)
system.time(constant <- ddply(df, "group", constant_cols))
# user system elapsed
# 20.531 1.670 22.378
stopifnot(identical(names(constant), c("group", "a", "b")))
stopifnot(nrow(constant) == 1000)
Run Code Online (Sandbox Code Playgroud)
在我的实际用例(深入ggplot2内)中,可能存在任意数量的常量和非常量列.示例中的数据大小大约是正确的数量级.
cis.statbib.org: script/console
Loading development environment (Rails 2.2.2)
Article.founc>> Article.count()
ActiveRecord::StatementInvalid: Could not find table 'article'
from /home/hadley/web/cis.statbib.org/vendor/rails/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb:29:in `table_structure'
from /home/hadley/web/cis.statbib.org/vendor/rails/activesupport/lib/active_support/core_ext/object/misc.rb:39:in `returning'
...
Run Code Online (Sandbox Code Playgroud)
但它似乎确实存在于数据库中:
db: sqlite3 development.sqlite3
SQLite version 3.2.8
sqlite> select count(*) from author;
168600
Run Code Online (Sandbox Code Playgroud)
我刚刚更新了所有的宝石,等等.出了什么问题?