当只在包的DESCRIPTION中导入foreach时如何使用%dopar%

11

如何避免在一个包的函数中出现“无法找到函数%dopar%”的问题,当该包的DESCRIPTION文件只是导入(imports)而不是依赖(depends)foreach时?是否有一种方式,就像我在函数中使用foreach :: foreach一样使用foreach ::%dopar%?谢谢。

代码示例:

在函数中:

foreach::foreach(1:9) %dopar% {

...}

描述

Imports: 
    Matrix,
    parallel,
    foreach,
   doParallel
3个回答

13
以下方法对我有用。定义本地的 %do%%dopar% 如下:
`%dopar%` <- foreach::`%dopar%`
`%do%` <- foreach::`%do%`

那么你应该能够运行

foreach::foreach(i = 1:9, .combine = "+") %dopar% {i}
foreach::foreach(i = 1:9, .combine = "+") %do% {i}

这个解决方案对我有效,而其他的则不行。谢谢。 - Andrew Schulman
这是一个很棒的答案,充分利用了R的能力,可以将任何东西定义为全局参数。谢谢你。 - undefined

7

您需要使用反引号:foreach::`%dopar%`(或者引号foreach::"%dopar%"也可以)。


1
你能不能更明确地说明如何显式调用 %dopar% ? 我试图运行以下代码,但不起作用。 foreach::foreach(i = 1:9, .combine = "+") foreach::\%dopar%` {i}` 我已经尝试了各种带反引号的组合,但通常会出现“意外符号”错误。谢谢! - Kevin Zen
@KevinZen 我不确定如何重现这个错误,而且我也不记得曾经遇到过。如果你使用引号,会出现相同的情况吗?如果定义一个别名,比如 \%dopar%` <- foreach::`%dopar%`` 然后直接使用它呢? - konvas
1
是的,如果我尝试显式定义此函数而不使用Roxygen2,则反引号和引号都无法工作。我意识到在使用Roxygen2时不需要担心foreach::%dopar%。只需使用import(foreach)就可以正常工作。 - Kevin Zen

4

@Kevin Zen,

我遇到了同样的问题,但是我认为我刚刚通过在命名空间文件中使用“importFrom”字段解决了它。我使用Roxygen2进行文档记录,所以我只需要包含标签:

#' @importFrom foreach %dopar%

使用foreach函数调用时,它会在命名空间文件中创建一个字段,例如:

importFrom(foreach,"%dopar%")

如果您没有使用Roxygen2,那么您可以将该行代码放入您的命名空间中,这也可以解决问题。

这样可以避免Cran检查发出警告。但是,一旦您尝试在未加载和附加“foreach”包的计算机上运行代码,就会出现问题:

library(foreach)

如果在你的DESCRIPTION文件中,"foreach"被列在"Imports"而不是"Depends"下面,你将会收到一个错误信息,提示%dopar%未找到。因此,请确保在"Depends"字段中包含foreach。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接