我的数据框看起来像这样:
pid tid pname 2 NA proc/boot/procnto-smp-instr
现在,如果我这样做,我预计不会发生任何事情:
y [c(FALSE),“pid”]< - 10
没有任何反应(y
没有改变)。但是,如果我这样做:
y [c(FALSE),] $ pid< - 10
我明白了:
$<-.data.frame
中的错误(*tmp*
,“pid”,值= 10):
替换 有1行,数据有0
所以我的问题是,[, "col"]<-
和$col<-
之间有什么区别?为什么会抛出异常?还有奖励:我可以在文档中哪些地方阅读更多相关信息吗?
答案 0 :(得分:2)
错误来自$<-.data.frame
的代码,它检查原始data.frame是否至少与替换向量的长度一样多行:
nrows <- .row_names_info(x, 2L)
if (!is.null(value)) {
N <- NROW(value)
if (N > nrows)
stop(sprintf(ngettext(N, "replacement has %d row, data has %d",
"replacement has %d rows, data has %d"), N, nrows),
domain = NA)
[<-
是一个不同的函数,它不执行此检查。这是一个primitive
函数,您可以在R Internals manual
答案 1 :(得分:1)
这一次,这些操作由两个非常不同的函数执行:
y[FALSE, 'pid'] <- 10
是对[<-.data.frame
函数的调用,而
y[FALSE, ]$pid <- 10
是对$<-.data.frame
函数的调用,错误消息为您提供了这个线索。通过输入他们的名字可以看到他们有多么不同(带背面引号,就像上面一样)。但是,在这种特殊情况下,他们的行为方式相同。他们通常会这样做。试试y[1, 'pid'] <- 1:3
vs y[1, ]$pid <- 1:3
。你的情况是“特殊的”,因为y[FALSE, ]
会返回一个“奇怪”的对象 - 一个包含0行和3列的data.frame。恕我直言,抛出异常是一种正确的行为,这是[<-.data.frame
函数中的一个小错误,但语言开发人员对此主题的看法更为重要。如果您想了解差异所在,请键入debug([<-.data.frame)
并运行您的示例。
你的“奖金”问题的答案是键入?[<-.data.frame
并阅读,虽然它非常非常干燥:(。最好。
PS。格式化条带反引号,例如,[<-.data.frame
意味着。遗憾。