我正在尝试从围嘴文件中获取特定标签的值。每当我尝试使用entry["bibtype"]
或entry[["bibtype"]]
时,我都会收到错误消息,但entry$bibtype
可以正常工作。
entry<-bibentry(
bibtype = "Manual",
title = "R: A Language and Environment for Statistical Computing",
author = person("R Development Core Team"),
organization = "R Foundation for Statistical Computing",
address = "Vienna, Austria",
year = 2010,
isbn = "3-900051-07-0",
url = "http://www.R-project.org/")
# the first two fail
entry["bibtype"]
entry[["bibtype"]]
entry$bibtype
foo <- list("bar" = "baz")
#all of these work
foo["bar"]
foo[["bar"]]
foo$bar
我得到的错误是:
Error in switch(attr(paper, "bibtype"), Article = formatArticle(paper), :
EXPR must be a length 1 vector
有人解决了吗?无论如何要强制两难接受这一点?
最佳答案
tl;博士"bibtype"
不是"bibentry"
对象中的命名组件,而是将其实现为属性。如果选择了“事物”,这些对象的$
方法就具有访问属性的特殊情况,而[
和[[
方法则没有此“功能”。
使用下面定义的rref
> attributes(unclass(rref)[[1]])$bibtype
[1] "Manual"
> attr(unclass(rref)[[1]], "bibtype")
[1] "Manual"
有关详细说明,请参见长版
您需要对象的属性,但是使用常规方法似乎无法使用这些属性,例如,使用
?bibentry
中的示例:## R reference
rref <- bibentry(bibtype = "Manual",
title = "R: A Language and Environment for Statistical Computing",
author = person("R Development Core Team"),
organization = "R Foundation for Statistical Computing",
address = "Vienna, Austria",
year = 2010,
isbn = "3-900051-07-0",
url = "http://www.R-project.org/")
我们注意到
"bibtype"
输出中的str()
属性> str(rref)
Class 'bibentry' hidden list of 1
$ :List of 7
..$ title : chr "R: A Language and Environment for Statistical Computing"
..$ author :Class 'person' hidden list of 1
.. ..$ :List of 5
.. .. ..$ given : chr "R Development Core Team"
.. .. ..$ family : NULL
.. .. ..$ role : NULL
.. .. ..$ email : NULL
.. .. ..$ comment: NULL
..$ organization: chr "R Foundation for Statistical Computing"
..$ address : chr "Vienna, Austria"
..$ year : chr "2010"
..$ isbn : chr "3-900051-07-0"
..$ url : chr "http://www.R-project.org/"
..- attr(*, "bibtype")= chr "Manual"
但我们无法访问该属性
> attr(rref, "bibtype")
NULL
> attr(rref[[1]], "bibtype")
NULL
第一个失败,因为就R而言,在R中实现
"bibentry"
类的对象的方式(或者更确切地说,是应用到它们的方法)attributes()
或attr()
可以看到此特定属性。可见的唯一属性是:> attributes(rref)
$class
[1] "bibentry"
> attributes(rref[1])
$class
[1] "bibentry"
如果我们使用
unclass()
rref
,那么我们需要认识到该对象是一个列表,列表中的元素与注解一样多。在这种情况下,rref
是具有单个组件的列表,这是“bibentry”类的对象,该类是7个组件的列表。一个天真地假定您可以做到这一点:
attr(rref[[1]], "bibtype")
它将从
"bibentry"
(只有一个)中获取第一个rref
对象,并在该对象上查找属性。这不起作用:> attributes(rref[[1]])
$class
[1] "bibentry"
由于对
[
对象实现了[[
和"bibentry"
方法的方式:> utils:::`[[.bibentry`
function (x, i)
{
rval <- unclass(x)[i]
class(rval) <- class(x)
rval
}
<bytecode: 0x1a75938>
<environment: namespace:utils>
[单个
[
方法的实现方式完全相同。]这意味着您可以执行以下愚蠢的操作:> rref[[1]][[1]][[1]][[1]]
R Development Core Team (2010). _R: A Language and Environment for
Statistical Computing_. R Foundation for Statistical Computing, Vienna,
Austria. ISBN 3-900051-07-0, <URL: http://www.R-project.org/>.
这没有任何意义,但是所有的
[[1]]
每次都仅引用同一个对象。我不知道这是否是故意的。 ?bibentry
有Note:
The bibentry functionality is still experimental.
但这不是最理想的。
现在,您需要遵循
utils:::`[.bibentry`
和unclass()
对象中的实现,然后开始子集并访问属性:> attributes(unclass(rref)[[1]])
$names
[1] "title" "author" "organization" "address" "year"
[6] "isbn" "url"
$bibtype
[1] "Manual"
> attributes(unclass(rref)[[1]])$bibtype
[1] "Manual"
> attr(unclass(rref)[[1]], "bibtype")
[1] "Manual"
将
utils:::`$.bibentry`
方法的实现与utils:::`[[.bibentry`
的实现进行对比:> utils:::`$.bibentry`
function (x, name)
{
is_attribute <- name %in% bibentry_attribute_names
rval <- if (is_attribute)
lapply(unclass(x), attr, name)
else lapply(unclass(x), "[[", name)
if (length(rval) == 1L)
rval <- rval[[1L]]
rval
}
<bytecode: 0x1b0fd70>
<environment: namespace:utils>
该方法专门设计用于属性。这一切在R中似乎都有些非标准行为。这解释了为什么
> rref$bibtype
[1] "Manual"
可行,但(天真的)本质上等效
> str(rref[["bibtype"]])
Class 'bibentry' hidden list of 1
$ : NULL
失败,因为未分类列表中的不是组件,它返回
"bibtype"
组件,而打印时发生错误:> foo <- rref[["bibtype"]]
> foo
Error in switch(attr(paper, "bibtype"), Article = formatArticle(paper), :
EXPR must be a length 1 vector
关于r - 如何使用[]或[[]]约定在bibentry类中引用特定标签?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9765493/