导出FinancialInstrument :::。仪器以预先解雇工人并打开包装

时间:2017-01-02 09:27:56

标签: r foreach parallel-processing financialinstrument

我正在进行一些并行处理,需要通过并行处理产生的每个工作人员从FinancialInstrument:::.instrument环境访问工具属性。

简单instrument.list <- as.list(FinancialInstrument:::.instrument)并且使用.export参数与foreach不起作用(因为下面的代码显示它在没有注册并行后端时起作用,而在它们没有时则不起作用)。请参阅下面的可重复示例:

library(FinancialInstrument)
library(parallel)
library(doParallel)
library(foreach)

currency(c("USD", "EUR")) # define some currencies
stock(c("SPY", "LQD", "IBM", "GS"), currency="USD") # define some stocks
exchange_rate("EURUSD") # define an exchange rate

ls_stocks() #get the names of all the stocks
ls_instruments() # all instruments

getInstrument("IBM")

instrument.list <- as.list(FinancialInstrument:::.instrument)

# First let's run this without parallel backend registered to show the code works
foreach(1:2,
        .packages="FinancialInstrument",
        .export="instrument.list"
        ) %dopar% {
            .instrument <- as.environment(instrument.list)
            message(paste0("Available instruments in .instrument environment: ", paste(ls_instruments(), collapse=", "), " ."))
        }


# Now, let's register a parallel backend
cl <- makeCluster(2, outfile="log.txt")
registerDoParallel(cl)

# And by looking in log.txt file we see that .instrument environment is not functioning properly. How to make this work?
foreach(1:2,
        .packages="FinancialInstrument",
        .export="instrument.list"
        ) %dopar% {
            .instrument <- as.environment(instrument.list)
            message(paste0("Available instruments in .instrument environment: ", paste(ls_instruments(), collapse=", "), " ."))
        }

stopCluster(cl)

1 个答案:

答案 0 :(得分:1)

我在worker中使用assignInNamespace函数工作了。以下是上述问题的工作代码:

library(FinancialInstrument)
library(parallel)
library(doParallel)
library(foreach)

currency(c("USD", "EUR")) # define some currencies
stock(c("SPY", "LQD", "IBM", "GS"), currency="USD") # define some stocks
exchange_rate("EURUSD") # define an exchange rate

ls_stocks() #get the names of all the stocks
ls_instruments() # all instruments

getInstrument("IBM")

instrument.list <- as.list(FinancialInstrument:::.instrument)

# First let's run this without parallel backend registered to show the code works
foreach(1:2,
        .packages="FinancialInstrument",
        .export="instrument.list"
        ) %dopar% {
            .instrument <- as.environment(instrument.list)
            message(paste0("Available instruments in .instrument environment: ", paste(ls_instruments(), collapse=", "), " ."))
        }


# Now, let's register a parallel backend
cl <- makeCluster(2, outfile="log.txt")
registerDoParallel(cl)

# And by looking in log.txt file we see that .instrument environment is not functioning properly. How to make this work?
foreach(1:2,
        .packages="FinancialInstrument",
        .export="instrument.list"
        ) %dopar% {
            assignInNamespace(".instrument", as.environment(instrument.list), "FinancialInstrument")
            message(paste0("Available instruments in .instrument environment: ", paste(ls_instruments(), collapse=", "), " ."))
        }

stopCluster(cl)