我有一个for循环,我希望与R
并行运行。以下循环使用index m
遍历数据库中的每个产品(我有总共M个产品的价格)。
我将定价函数作为输入传递原始价格(这是一个数字)和从列表中读取的折扣率(因此我必须使用[[]] formulation
提取此值。
for(m in 1:M)
{
myList[paste0("Product", m)] <- list(priceProduct(originalPrice, discounts[[m]]))
}
这个循环工作正常,最后我有一个列表myList
包含每个产品的正确折扣价格。 myList具有名为ProductX
的所有元素,其中X是我原始数据库中的产品位置(在循环中是计数器m)。
唯一的问题是运行起来非常慢,所以我想知道如何并行化这个。
有什么建议吗?
答案 0 :(得分:0)
在担心并行处理之前先将代码矢量化。 R代码通常是矢量化的,但并行处理仍然需要更多的工作。 foreach
和Rcpp
(如果您了解C ++)包也可以使事情变得更加简单。或者你可以试试Julia的运气,虽然不够成熟但速度很快。但是,对于大多数日常工作来说,矢量化可以解决这个问题。
您的问题的答案取决于您的数据和功能的结构具体细节。以下是一些宽松的假设,但您应该能够根据您的具体情况进行调整。 (或者只是添加更多细节,我会回来编辑。)
# Let's say:
m <- 100
# `paste` functions can accept a sequence, and are easy to vectorize
product <- paste0("Product", 1:m)
# Let's chuck everything in a `data.frame` to stay organized:
data <- data.frame(product, originalPrice, discount)
# If `priceProduct` accepts vector arguments:
data$salePrice <- priceProduct(data$originalPrice, data$discount)
# If not:
data$salePrice <- sapply(seq(1, nrow(data)), function(x){
priceProduct(data$originalPrice[x], data$discounts[x])
})
# If it spits out a list, more cleaning is in order:
data$salePrice <- do.call(c,
sapply(seq(1, nrow(data)), function(x){
priceProduct(data$originalPrice[x], data$discounts[x])
}))