我有一个数据帧,看起来像这样:
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", value = 10)错误:
更换有1行,数据有0
所以我的问题是,[, "col"]<-
和$col<-
有什么区别?为什么要抛出异常?额外的好处是:在文档中我可以读到更多关于这个的信息?
该错误来自$<-.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内部手册
这一次,这些操作是由两个非常不同的函数执行的: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行和三列的data.frame。IMHO,抛出异常是一种正确的行为,这是[<-.data.frame
函数中的一个小错误,但是语言开发人员对这个主题的看法更重要。如果您想自己看看区别在哪里,输入debug([<-.data.frame)
并运行您的示例。你的"奖励"问题的答案是输入?[<-.data.frame
并阅读,尽管它非常非常干燥:(最好的。
p。格式化去掉反引号,因此,例如,[<-.data.frame
意味着。对不起。