2014-11-25 52 views
7

我有以下功能供个人使用。它需要一个作者的名字,看看我的机器上是否有他们的软件包。为什么rownames(installed.packages())具有names属性?

authoredPackages <- function (author) 
{ 
    s <- sapply(rownames(installed.packages()), 
     packageDescription, fields = "Author") 
    names(grep(author, s, value = TRUE)) 
} 

这是问题所在。当打开一个新的R会话和分配功能,第一次调用该函数总是返回空字符串的字符向量它应该返回向量的正确长度。为了表明这一点,请打开一个新的R会话,分配函数,并使用您最喜欢的包作者的姓氏来运行它。它应该首先返回一个空的字符向量...

authoredPackages("Temple Lang") 
# [1] "" "" "" "" 

...然后再做一次,它返回正确的结果......

authoredPackages("Temple Lang") 
# [1] "jsonlite" "RCurl" "RJSONIO" "XML"  

它总是只发生在第一次调用在新的R会议上。为什么会发生这种情况,我该如何解决这个问题,以便该功能始终可以在第一次尝试时使用?

R --vanilla会议信息:

R version 3.1.1 (2014-07-10) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base 

更新:一旦打开R,则似乎rownames(installed.packages())有因为lme4包的names属性。不知道为什么,这是唯一的名字。在第二次通话中它消失也很奇怪。

rownames(installed.packages())[228] 
# ret0 
# "lme4" 
+1

有R --vanilla开始? 'sessionInfo()'?我'authoredPackages()'按预期工作的修补[R版本3.1.2(2014年10月31日r66919)/平台:x86_64的未知-Linux的GNU(64位)和R在发展(不稳定)(2014- 11-23 r67046)/平台:x86_64的未知-Linux的GNU(64位) – 2014-11-25 00:27:58

+2

好像'ret0'在'installed.packages'源,当提到NOCACHE = FALSE朝向函数的末尾;也许增加'noCache = TRUE'作为参数是一个解决方法? – 2014-11-25 01:45:20

+1

@MartinMorgan:不错的猜测,但添加'noCache = TRUE'仍然会给我带来同样奇怪的结果。 – 2014-11-25 13:37:39

回答

7

奇怪,但好像rownames(installed.packages())names属性你第一次调用它。

> str(rownames(installed.packages())) 
Named chr [1:125] "bdsmatrix" "bitops" "blotter" "brew" "car" "changepoint" "chron" "colorout" ... 
- attr(*, "names")= chr [1:125] "" "" "" "" ... 
> str(rownames(installed.packages())) 
chr [1:125] "bdsmatrix" "bitops" "blotter" "brew" "car" "changepoint" "chron" "colorout" "colorspace" ... 

对不起,它留给你来回答这个问题。只要确保没有名字。这是给你的,因为你靠的USE.NAMES=TRUEsapply的默认的一个问题,但只有当他们不存在添加名字。他们出席一些非常奇怪的原因。

authoredPackages <- function (author) 
{ 
    r <- setNames(rownames(installed.packages()), NULL) 
    s <- sapply(r, function(x) packageDescription(x)$Author) 
    names(grep(author, s, value = TRUE)) 
} 

这里是我的sessionInfo(从R --vanilla开始):

> sessionInfo() 
R version 3.1.1 (2014-07-10) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.1.1 

我刚刚升级到R-3.1.2,并试图再次。我仍然得到同样的奇怪的结果,而且我让他们始终如果我使用@MartinMorgan的建议,使用noCache=TRUE

> str(rownames(installed.packages(noCache=TRUE))) 
Named chr [1:125] "bdsmatrix" "bitops" "blotter" "brew" "car" "changepoint" "chron" "colorout" ... 
- attr(*, "names")= chr [1:125] "" "" "" "" ... 
> str(rownames(installed.packages(noCache=TRUE))) 
Named chr [1:125] "bdsmatrix" "bitops" "blotter" "brew" "car" "changepoint" "chron" "colorout" ... 
- attr(*, "names")= chr [1:125] "" "" "" "" ... 
> str(rownames(installed.packages(noCache=TRUE))) 
Named chr [1:125] "bdsmatrix" "bitops" "blotter" "brew" "car" "changepoint" "chron" "colorout" ... 
- attr(*, "names")= chr [1:125] "" "" "" "" ... 
> sessionInfo() 
R version 3.1.2 (2014-10-31) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] setwidth_1.0-3 colorout_1.0-1 

loaded via a namespace (and not attached): 
[1] tools_3.1.2 
相关问题