问题标签 [drake-r-package]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
r - 在 drake 中跨多个计划处理多个文件
我正在尝试使用drake
R 包来处理跨多个计划的多个文件输入,因此我可以迭代地构建我的目标,测试每个阶段的工作原理。下面是一个简单的代表,显示了我想要完成的事情。官方文档展示了如何在一个计划中做这种事情,但我的困难是我想跨过多个计划执行此操作。
我无法弄清楚转换应该是什么才能将正确的输入名称(来自read_in_plan
的目标)放入munge_plan
由reprex 包(v0.2.1)于 2019 年 5 月 23 日创建
r - 从 RAM 中删除加载的 drake 缓存对象
我已经计划在德雷克的缓存中创建大量对象。现在,在计划之外,我运行lapply
了这些对象的一个子集,以便总结它们的一些属性并计划我的下一步。
我正在使用readd
在我正在应用的函数中加载这些缓存对象中的每一个,但是在我完成它们之后它们似乎仍然会占用 RAM。这在我的场景中是一个问题,因为它在完成时是 100 GiB 的 RAM。如果我需要明确删除它们,我不确定我应该在环境中的哪个位置寻找它们。
我知道德雷克正在做类似于缓存记忆的事情,因为如果我readd
两次相同的对象,第一次需要时间从磁盘读取,第二次是瞬时的。但在这种情况下,我想将缓存视为一个简单的数据源,就像任何其他文件一样,这样一个对象就不会占用 RAM,如果它是rm()
'd 或超出范围。
r - 切片(原始)向量的更快方法?
问题
我正在寻找一种快速(理想情况下是恒定时间)的方法来在 R 中获取一个长原始向量的大切片。例如:
即使使用 ALTREP,base R 也需要很长时间。
为什么?
因为我想加快速度storr
以加快速度drake
。我想storr
更快地保存长原始向量。writeBin()
速度非常快,但它仍然无法处理超过 2^31 - 1 bytes long 的向量。所以我想将数据保存在可管理的块中,如此处所述。这几乎可以工作,但是创建块太慢了,并且它在内存中复制了太多数据。
想法
让我们创建一个函数
这基本上相当于
在时间和内存上都是 O(1)。理论上,我们需要做的就是
- 传递
obj
给 C 函数。 - 创建一个指向 的第一个字节的新指针
obj
。 - 将新指针递增到切片的开头。
RAWSXP
在具有适当长度(小于 2^31 字节)的新指针处创建一个。- 返回
RAWSXP
.
我有 C 的背景,但我很难完全控制R 的内部结构。我想访问SEXP
s 中的 C 指针,这样我就可以进行基本的指针运算并从未修饰的 C 指针创建已知长度的 R 向量。我在 R 的 C 内部找到的资源似乎没有解释如何包装或解开指针。我们需要Rcpp
这个吗?
下面的粗略草图说明了我正在尝试做的事情。
编辑:一些更多潜在的解决方法
感谢 Dirk 激发了我对此的思考。对于足够小的数据,我们可以使用fst
保存单列数据框,其中列是我们真正关心的原始向量。这种使用fst
比writeBin()
由reprex 包(v0.3.0)于 2019 年 6 月 16 日创建
不幸的是,很难创建具有 2^31 或更多行的数据框。一个技巧是首先将原始向量转换为矩阵,我们避免了通常的整数溢出,因为 (2^31 - 1)^2 字节是几个艾字节。
由reprex 包(v0.3.0)于 2019 年 6 月 16 日创建
我们仍然在尘土中离开saveRDS()
,但我们不再击败writeBin()
。从数据框到矩阵的转换很慢,我不确定它是否能很好地扩展。
由reprex 包(v0.3.0)于 2019 年 6 月 16 日创建
如果像 Dirk 建议的那样,我们可以使用 anR_xlen_t
来索引数据框的行,我们也许可以避免转换任何内容。
r - 重命名目标而无需重建
最近在德雷克计划上运行 make() 后,我注意到我给其中一个目标指定了错误的名称。不幸的是,这也恰好是运行时间较长的目标之一。有没有办法在德雷克计划中重命名目标而不导致目标过时?
r - 如何创建计划目标以交叉先前地图目标的结果和新变量?
从a
使用 map 创建的多个目标 ( ) 中,我有 2 个其他目标 (b
和d
) 迭代第一个目标。现在我想在另一个目标中使用这些目标的结果。此外,我想与另一个变量 ( model
) 交叉。
我在下面粘贴了一个代表,但在我的情况下,对于某些上下文,a
描述数据集的不同子集,b
并d
预先计算一些东西,e
使用预先计算的数据在每个子集上应用不同的模型。
我尝试了不同的组合map
cross
(如下e
所示)但没有成功。我试图在 fn4 中添加我想要使用的所有目标名称,但它会创建不必要的交叉。
由reprex 包(v0.3.0)于 2019-07-15 创建
它似乎有效,但arg1
andarg2
没有被延续,并且不能用于fn4
和跟随目标。我应该把这一步分成两步吗,如果是的话怎么做?(map
然后cross
,cross
然后map
?)我尝试过早点,之后a
,但我不会重新计算相同b
和d
多次,这可能需要大量时间和内存。
编辑:一个更现实的例子
因为许多目标使用需要保存为run
函数文件的相同数据(调用外部二进制文件),所以为了防止多次重新计算相同的东西并将相同的东西多次保存在不同的文件中(taht 可以是巨大的)我在德雷克分离了所有这些任务。
由reprex 包(v0.3.0)于 2019-07-15 创建
编辑2:
我现在使用.data
具有先前目标名称的数据框(使用rlang::syms
)在地图转换中使用该参数,它工作正常,但它不适用于drake::drake_plan
'smax_expand
参数。这个解决方案也不是最优的,因为制作一个网格.data
非常冗长。
r - 共享驱动器上带有 drake 的文件路径
我遇到了一些我无法弄清楚的奇怪的德雷克行为。我正在尝试在.rmd
我的德雷克计划中添加一个。我正在使用远程机器和该机器上的网络驱动器。如果我尝试将 .rmd 文件添加到我的计划中,如下所示:
我尝试了以下排列来完成这项工作:
- 将 移动
.rmd
到本地驱动器并使用完整路径调用它 - 添加
file.path
内部和外部knitr_in
以完成完整路径。 - 尝试使用
file_in
上述每个场景。
我也尝试过调试,但是当德雷克将文件名转换为哈希然后将其转换回文件的基本名称时,我有点迷失了(即report.Rmd
)。错误最终在digest::digest
被调用时发生。
有没有人有尝试弄清楚这样的事情的经验?
drake-r-package - Very long run times for drake, compared to when I run simply through R
I am trying to use drake for my workflow. It seems to have a lot of potential, but I noticed that that drake takes a very long time to run, and even simple step that take less than a second when I run "manually", can take 20 seconds or more when they are run with drake.
I'm aware that I did not provide enough details on this problem. Please tell me what kind of details to provide, and I will do so.
The dataset contains protein levels (a few tens) measured in patients undergoing various treatments. The protein levels are read from an ExpressionSet object, and then a linear model (including contrasts) is performed on each of these proteins. Here are the essential parts of the code:
The code is placed within an rmarkdown notebook.
Gil
r - 如何在不组合数据集的情况下将多个德雷克目标组合成一个交叉目标?
德雷克岩石!我有一个复杂的多级处理问题。这个问题可以用这个例子来说明。我在级别 l 有 2 个进程,我希望所有级别 1 进程生成的所有数据集都由级别 2 的单个目标处理。
下面的代码做了我想要的,但我必须在第 2 级重复代码,在我的复杂情况下,这似乎是错误的。
由reprex 包(v0.3.0)于 2019 年 9 月 5 日创建
我想将 process2[ab] 步骤组合成一个目标。这可能吗?
似乎我应该能够有一个目标,例如:
但这不起作用。
r - `r_make()` 和 `make()` 在 r-drake 中不一致
我正在使用 RStudio 进行相关工作。直到昨天我决定试一试时,我一直忽略使用drake::make()
提示。r_make()
现在,我有点苦恼。不知道我做了什么/如果我发现了一个错误。
我的项目计划不大,但目标构建很大(每个数据拉取 10-20 分钟)。make()
我已经使用RStudio 控制台端到端运行它。一切都是最新的。即使我R
在终端中打开一个单独的会话并运行outdated()
,我也看不到任何过时的东西。
但是,r_make()
从 Rstudio 控制台或R
在单独的终端中运行会导致许多目标过时。
而且无论我运行多少次r_make()
,这些对象都保持未更新。
我不知道该怎么做。我想继续使用r_make()
,但我卡住了。
更新
https://gitlab.com/rsangole/drake-test上的可重现示例
更新 2
运行@landau 的reprex
示例,输出在这里。正如 Will 使用此脚本获得的那样,它工作正常:https ://gitlab.com/rsangole/drake-test/snippets/1894934
然而...
如果我在 RStudio 中以交互模式运行https://gitlab.com/rsangole/drake-test/blob/master/make.R ,我可以重现我的情况。重现:
- 打开新的 Rstudio,清理环境
- 在https://gitlab.com/rsangole/drake-test中下载可重现的示例
- 运行https://gitlab.com/rsangole/drake-test/blob/master/make.R
- 期望输出如https://gitlab.com/rsangole/drake-test/snippets/1894937
即使更新drake
到最新的前沿版本后也会出现同样的问题
make.R
如果我通过R
in运行,也能够复制问题,zsh
从而完全绕过 RStudio。
drake-r-package - 可视化时未找到哈希
在我的活动项目中,我今天发现了这个错误。目标是最新的。然而,可视化失败。
我该如何调试?