2017-05-31 37 views
0

我編寫了一個R包,其中包含使用xts對象的S4類。這是我的理解,我需要包括行setOldClass(「xts」)導致自定義R包中的問題

setOldClass("xts") 
stock.returns <- setClass(
    Class = "stock.returns", 
    slots = c(xts_returns = "xts", timeframe = "timeframe", currency = "character"), 
    prototype = prototype(xts_returns = xts::xts(, order.by = c(lubridate::today())), timeframe = timeframe(), currency = "Local") 
) 

在我的類定義腳本的頂部。當我使用我的包創建我的對象時,會發生問題。它的工作原理,但我偶爾得到這樣的警告反覆幾次:

Found more than one class "xts" in cache; using the first, from namespace 'quantmod' 

我怎麼能強迫我的班,而不是使用默認爲quantmod包正確xts包?如果不這樣做,我該如何至少停止警告?

我注意到Hadley Wickham和另一個人在同一主題上的對話:http://r.789695.n4.nabble.com/setOldClass-quot-xts-quot-td4714332.html。它無處可去。

編輯:我的空間文件

# Generated by roxygen2: do not edit by hand 

export("%>%") 
export(EOMonth) 
export(EOWeek) 
export(VaR.cree) 
export(date_to_sql_string) 
export(df_to_xts) 
export(ewma) 
export(factor_model_maker) 
export(flatten_xts) 
export(get_USD_fx) 
export(get_benchmark_index) 
export(get_benchmark_xts_returns) 
export(get_bond_index) 
export(get_currency_index) 
export(get_end_date) 
export(get_financial_history) 
export(get_financial_history_and_make_it_monthly) 
export(get_frequency) 
export(get_fund_performance) 
export(get_fx_USD_history) 
export(get_fx_cross) 
export(get_index_snapshot) 
export(get_metrics_history) 
export(get_portfolio) 
export(get_price_history) 
export(get_shock_results) 
export(get_shock_results.yield_version) 
export(get_spc_xts_raw_total_returns) 
export(get_spc_xts_returns) 
export(get_start_date) 
export(get_table_from_sql_CISMPRDSVR) 
export(get_test_date) 
export(get_ticker_xts_return_index) 
export(get_ticker_xts_t_data_fs_eps) 
export(get_watchlist) 
export(get_yield_index) 
export(market_capture_ratio) 
export(previous_business_date_if_weekend) 
export(price_plot) 
export(rel_plot) 
export(return_over_horizon) 
export(rolling_correlation) 
export(run_sql_in_CISMPRDSVR) 
export(scenario_analysis) 
export(show_regression) 
export(single_experiment_summary) 
export(stock.returns) 
export(timeframe) 
export(update_fund_performance_from_spreadsheet) 
export(write.zoo) 
export(xts_add_average_series) 
export(xts_price_from_returns) 
export(xts_returns) 
exportClasses(timeframe) 

而我的描述文件:

Package: cree 
Title: CI Risk Engine, Eh? 
Version: 0.0.0.9000 
[email protected]: person("Mr", "lebelinoz", email = "[email protected]", role = c("aut", "cre")) 
Description: All the in-house risk tools built in R. 
Depends: R (>= 3.3.1) 
License: Proprietary. Do not distribute outside My Company Limited. 
Encoding: UTF-8 
LazyData: true 
RoxygenNote: 6.0.1 
Imports: 
    tidyverse, 
    lubridate, 
    quantmod, 
    xts, 
    zoo, 
    RODBC, 
    PerformanceAnalytics 
Collate: 
    'Functions.R' 
    'Sql_Wrapper.R' 
    'StockPlot.R' 
    'VaR.cree.R' 
    'ewma.R' 
    'timeframe.R' 
    'stock.returns.R' 
    'factor_model_maker.R' 
    'get_benchmark_index.R' 
    'get_bond_index.R' 
    'get_currency_index.R' 
    'get_financial_history.R' 
    'get_fx_.R' 
    'get_metrics_history.R' 
    'get_portfolio.R' 
    'get_price_history.R' 
    'get_shock_results.R' 
    'get_shock_results.yield_version.R' 
    'get_yield_index.R' 
    'market_capture_ratio.R' 
    'return_over_horizon.R' 
    'scenario_analysis.R' 
    'show_regression.R' 
    'show_regression_between_xts.R' 
    'single_experiment_summary.R' 
    'update_fund_performance_from_spreadsheet.R' 
+0

你有沒有嘗試使用'::'運算符?例如:'xts ::'以避免衝突? – ar7

+0

@ ar7是的我有,但它會導致編譯錯誤。我已經添加了示例類,以幫助澄清我的問題。 – lebelinoz

+0

您的NAMESPACE和DESCRIPTION文件也是相關的。您的軟件包源代碼是否公開? –

回答

2

的問題是,你的空間文件不包含任何進口。在DESCRIPTION文件中指定Imports僅表示您的軟件包從列出的軟件包中導入了東西。您還必須明確導入NAMESPACE文件中的特定功能。

使用的骨架包,我可以使用下面的命令複製的消息:

library(quantmod) 
stock_returns = anRpackage::stock.returns()@xts_returns 
economic.factor.model <- setClass("economic.factor.model", 
    slots = c(stock_returns = "xts", factor_premiums = "xts")) 

但如果我輸入quantmod,XTS和動物園我沒有得到任何消息。我的包只包含下列文件:

> ls -l anRpackage/* 
-rw-rw-r-- 1 josh josh 311 Jun 21 05:35 anRpackage/DESCRIPTION 
-rw-rw-r-- 1 josh josh 75 Jun 21 05:55 anRpackage/NAMESPACE 

anRpackage/man: 
total 4 
-rw-rw-r-- 1 josh josh 713 Jun 21 05:38 anRpackage-package.Rd 

anRpackage/R: 
total 4 
-rw-rw-r-- 1 josh josh 364 Jun 21 05:40 file.R 

描述的內容是:

Package: anRpackage 
Type: Package 
Title: What the package does (short line) 
Version: 1.0 
Date: 2017-06-21 
Author: Who wrote it 
Maintainer: Who to complain to <[email protected]> 
Description: More about what it does (maybe more than one line) 
License: What license is it under? 
Imports: quantmod, xts, zoo 

命名空間的內容如下。請注意,我只是從3個列出的軟件包中導入所有內容以進行測試。有選擇地只導入您使用的功能是更好的做法。如果您的NAMESPACE文件中沒有import()命令,則可以使用R CMD check來告訴您需要從每個包中導入哪些功能。

經驗教訓:R CMD check即使您不打算將您的軟件包提交給CRAN也很有用。 ;-)

exportPattern("^[[:alpha:]]+") 
import(quantmod) 
import(xts) 
import(zoo) 

R/file.R的內容是:

setOldClass("xts") 
stock.returns <- setClass(
    Class = "stock.returns", 
    slots = c(xts_returns = "xts", 
       timeframe = "character", 
       currency = "character"), 
    prototype = prototype(xts_returns = xts::xts(, order.by = Sys.Date()), 
          timeframe = "timeframe()", 
          currency = "Local") 
) 

而且人/ anRpackage-package.Rd的內容是:

\name{anRpackage-package} 
\alias{anRpackage-package} 
\alias{anRpackage} 
\docType{package} 
\title{ 
\packageTitle{anRpackage} 
} 
\description{ 
\packageDescription{anRpackage} 
} 
\details{ 

The DESCRIPTION file: 
\packageDESCRIPTION{anRpackage} 
\packageIndices{anRpackage} 
~~ An overview of how to use the package, including the most important ~~ 
~~ functions ~~ 
} 
\author{ 
\packageAuthor{anRpackage} 

Maintainer: \packageMaintainer{anRpackage} 
} 
\references{ 
~~ Literature or other references for background information ~~ 
} 
\keyword{ package } 
\seealso{ 
~~ Optional links to other man pages, e.g. ~~ 
~~ \code{\link[<pkg>:<pkg>-package]{<pkg>}} ~~ 
} 
\examples{ 
#~~ simple examples of the most important functions ~~ 
} 
+0

謝謝。有沒有修改NAMESPACE的'roxygen2'方法?我的NAMESPACE文件的第一行是'#由roxygen2生成:不用手編輯' – lebelinoz

+1

我想我找到了答案。我需要在我的'roxygen2'註釋中使用'@ import'和'@ importFrom'標記,如https://stackoverflow.com/questions/10325231/when-writing-my-own-r-package-i-似乎可以得到其他軟件包到進口corr/10325867#10325867 – lebelinoz

+1

@lebelinoz:是的,我鼓勵你使用'@ importFrom'而不是拉入整個軟件包。 –