我在通过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 的命名空间问题?