使用package :: object notation

时间:2016-04-28 22:19:09

标签: r lubridate

我在通过Rscript运行时执行依赖于方法包的函数时遇到了一些麻烦。我已经知道方法不是通过Rscript 附加,但它应该由依赖包加载(并且可用)并且可以通过它们的包名称空间访问,至少我是这么认为的...

示例R脚本(通过Rscript执行):

#!/usr/bin/Rscript

sessionInfo()

tryCatch({
    str(lubridate::days(30))
}, error = function(e) {
    print(e)
})

sessionInfo()

tryCatch({
    str(lubridate::days(30))
}, error = function(e) {
    print(e)
})

library(methods)
str(lubridate::days(30))
sessionInfo()

输出,我的评论和问题在下面混合......

首先,这是启动sessionInfo()

# sessionInfo()

R version 3.2.2 (2015-08-14)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Amazon Linux AMI 2015.09

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  base

正如预期的Rscript一样,包方法未附加,也未加载。

现在,让我感到惊讶的是,我认为lubridate::days(30)调用会加载方法,因为 lubridate 包有&#34 ;依靠" 方法,在 lubridate DESCRIPTION文件中验证。相反,我得到错误:

# tryCatch({
#     str(lubridate::days(30))
# }, error = function(e) {
#     print(e)
# })

<simpleError in .setupMethodsTables(fdef, initialize = TRUE): trying to get slot "group" from an object of a basic class ("NULL") with no slots>

但现在我真的感到困惑,因为方法 似乎已经加载了,正如下一个{{ 1}}来电:

sessionInfo()

为了确保(关于我的困惑),让我们再次尝试拨打# sessionInfo() R version 3.2.2 (2015-08-14) Platform: x86_64-redhat-linux-gnu (64-bit) Running under: Amazon Linux AMI 2015.09 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 base loaded via a namespace (and not attached): [1] magrittr_1.5 tools_3.2.2 lubridate_1.5.6.9000 [4] stringi_1.0-1 methods_3.2.2 stringr_1.0.0

lubridate::days(30)

同样的错误。

好的,现在让我们明确附加方法并再次尝试# tryCatch({ # str(lubridate::days(30)) # }, error = function(e) { # print(e) # }) <simpleError in .setupMethodsTables(fdef, initialize = TRUE): trying to get slot "group" from an object of a basic class ("NULL") with no slots> 来电:

lubridate::days(30)

那很有效! 具体通过附加 方法改变了什么?:

# library(methods)
# str(lubridate::days(30))

Formal class 'Period' [package "lubridate"] with 6 slots
  ..@ .Data : num 0
  ..@ year  : num 0
  ..@ month : num 0
  ..@ day   : num 30
  ..@ hour  : num 0
  ..@ minute: num 0

方法现已附加(与已加载但未附加相对)。

我知道我可以通过简单地在脚本上包含# sessionInfo() R version 3.2.2 (2015-08-14) Platform: x86_64-redhat-linux-gnu (64-bit) Running under: Amazon Linux AMI 2015.09 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] methods stats graphics grDevices utils datasets base loaded via a namespace (and not attached): [1] magrittr_1.5 tools_3.2.2 lubridate_1.5.6.9000 [4] stringi_1.0-1 stringr_1.0.0 来解决所有令人头疼的问题,但这看起来很愚蠢,因为我认为加载方法会对底层包具有相同的影响(到期)到R的包命名空间),我不必具体了解我使用的任何包依赖于方法

这看起来像是一个R问题,或者可能是我的(可能是不幸的选择)示例包 lubridate 的命名空间问题?

0 个答案:

没有答案
相关问题