问题标签 [callr]
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 - R callr 不同的 R 版本
是否可以callr::r
使用与当前使用的版本不同的 R 版本运行?一个示例是从 R3.5.1 调用以下内容,但使用 R3.4.1 执行它。
它应该返回类似“3.4.1”的内容。我已经研究过了callr:::setup_r_binary_and_args
,但它需要当前的 R 版本。
r - 是否可以为 RMarkdown 禁用`callr`?
尝试为 {disk.frame} 构建小插图时,我不断收到错误消息。我认为这是由于使用 NSE 的 {callr} 的错误行为。
是否可以不将 {callr} 与 RMarkdown 一起使用?我认为 {callr} 在后台创建了一个新的 R 会话,但如果我只是使用同一个会话来构建 Markdown,那么我应该没问题。但是我在 Rmarkdown 文档中找不到可以禁用 {callr} 的位置。
更新
这是您可以尝试的代码
r - 嵌套后台/并行进程的生成失败
我正在尝试构建一个在AWS ECS上运行并涉及包{future}、{future.callr}和{furrr}的 dockerized R 微服务(因此隐含{callr}和{processx})
当我使用限制为1 个 CPU和650 MB内存的 docker 容器进行本地测试时(与我的客户的舞台设置相匹配;生产有1500 MB和4 个 CPU),一切正常。
但是,在实际的 AWS 实例上,我收到以下错误:
错误一:
错误2:
我在这里完全超出了我的深度,谁能给我一个提示,告诉我发生了什么和/或我该如何解决这个问题?
在这个问题上提供一个代表有点困难,但这里是一般设置的主要要点:
确保后台进程
处理两个操作“同时”发生的包装函数,其中每个操作需要在 3 个实体上并行化(x
例如长度为 3)
每个并行化周期中要执行的实际功能
r - 带有 invalidateLater() 的简单闪亮应用程序错误地丢弃了持久后台进程
我正在尝试编写一个最小的 Shiny 应用程序来维护一个持久的外部后台进程。由于特定于全尺寸用例的原因,我在文本文件中跟踪 PID 而不是仅使用processx
句柄。当我启动应用程序时,它看起来像这样:
当我按下“开始”按钮时,应用程序会创建一个后台进程并将 PID 记录在一个文本文件中。invalidateLater()
重复读取文本文件并显示 PID 和状态的反应上下文。
该过程应该运行,直到我单击“停止”。但在初始化后不到一秒钟,该进程自行退出。
如果我删除invalidateLater()
,该过程将继续运行。或者,如果我使用processx
句柄而不是ps
文本文件,则该应用程序可以工作,但这对于我的用例来说还不够。
应用代码
会话信息
编辑:垃圾收集
这是因为垃圾收集processx
句柄。我可以用 2 个 R 会话来证明这一点。会话 1 创建一个后台进程。
会话 2 循环检查从会话 1 产生的后台进程。
TRUE
会话 2 从每秒打印一次开始。但是当我rm(px); gc()
在会话 1 中调用时,会话 2 打印FALSE
。
我现在看到垃圾收集的终止是一个故意的功能processx
:https ://github.com/r-lib/processx#features 。我猜在大多数情况下都是合理的。
r - R process$new 将标准输出和标准错误写入同一个文件
在我的 R 代码中,我将另一个 R 脚本称为像这样的单独进程
记录器消息和任何错误都被写入同一个日志文件。但是错误消息写在文件顶部而不是写在页面底部
示例日志文件
在上面的示例日志文件中,当错误发生时,我希望在文件末尾打印错误
我也可以问一个子问题吗?为什么即使在代码中有错误之后仍然rp$get_exit_status()
返回?zero
r - 如何在 multidplyr 中设置超时
使用时我不一致地收到以下错误multidplyr
(即,对于相同的数据,有时我会收到错误,有时不会):
rs_init 中的错误(self、private、super、options、wait、wait_timeout):无法启动 R 会话,超时
我的设置如下:
recursive_func_c
调用的函数在哪里:
据我正确理解,multidplyr 集群由多个由callr
. 我收到的错误消息似乎来自callr
包。对于调试,我想为callr
within设置更长的超时时间multidplyr
。那可能吗?谢谢你的任何提示。
r - 如何使用 future.callr 抑制随机数生成警告?
future.callr
每次请求未来时,我都会使用它创建一个新线程(?),因此它是单独计算的,主 R 脚本可以继续前进。
当我的期货回来时,我收到以下警告:
在我正在运行的实际代码中,它只是加载一些数据,我不知道为什么(或关心编辑:我确实关心,请参阅下面的评论)它正在生成随机数。如何阻止显示该警告(修复 rng 生成或忽略它)?
我有很多关于期货的行,所以我希望能够以某种方式在开头设置选项,而不必将其添加到每一行。
这是一个示例,我试图忽略该警告。
r - 在 callr::r() 和 callr::r_bg() 中使用加载了 load_all() 的 R 包的函数
我正在开发一个 R 包,并希望在后台运行正在开发的包中的一些功能,使用callr::r()
或callr::r_bg()
.
例如,我创建了一个只有一个功能的包mytest
然后用 加载包pkgload::load_all()
,使用devtools包加载开发中的包的功能。之后,我可以在控制台中运行该功能,但不能在后台使用callr::r()
.
另一方面,如果我安装包并运行library(mytest)
,上面的代码运行没有问题
请,任何线索为什么callr::r()
找不到功能mytest::hello()
?
看起来load_all()
没有将路径添加到可以找到包mytest的源代码的文件夹中。
r - rmarkdown 渲染 NSE 函数仅在调用者内部失败
我似乎有 NSE、rmarkdown 和 callr 的奇怪组合,类似于Is it possible to disable `callr` for RMarkdown? .
当我为变量设置一个值以在类似于使用 NSE 通过嵌套 eval 和列表调用实现的过滤器调用中使用它时,它会严重失败,但仅在 callr 中失败。
通过调用者运行它:
可以看到它的抱怨sig_cutoff
是没有找到,但它存在于环境中,但似乎没有得到传递。
如果我直接运行它,它可以工作:
我已将所有代码放在github repo中。
有趣的是,这绝对是调用者的问题,因为目标也有同样的问题。
调用者 v 1.0.7,rmarkdown v 2.11,R 4.1.0
其他包版本在renv.lock文件中。
r - 在单独的 R 会话中运行 testthat 测试(如何组合结果)
我需要测试包加载操作(对于我的多版本包)并且知道卸载命名空间和东西是危险的工作。所以我想在一个新的 R 会话中运行每个测试。并行运行我的测试不能满足这个需求,因为它会重用从站,并且这些会变脏。
所以我想callr::r
会帮助我。不幸的是,我再次被记录在案的记者所困。
以下是一个最小的示例。放在文件中test-mytest.R
。
我使用以下方法调用了这个测试文件:
这似乎可以满足我的要求,但是在查看结果时...
...这只是返回的第一个测试。
这个怎么运作:
- 执行普通测试。
- 获取当前使用的记者(
-- 1 --
) callr::r
用于调用包含测试的测试块。- 在通话中,我尝试使用
set_reporter
,但with_reporter
实际上是相同的。 - 呼叫返回记者(用
callr::r
尝试过get_reporter()
,但with_reporter
也返回记者(隐形))
现在返回的记者似乎很好,但是当将其设置为实际的记者时set_reporter
,似乎并没有覆盖实际的记者。
请注意,在 处-- 2 --
,reporter_out
包含两个测试结果。
问题
我不确定我希望它做什么,但最后我希望将结果添加到原始报告器((summary
或)reporter_in
,也就是说,如果那不是某种副本)。