如何在R脚本中自动响应PC-Clocks甲基化分析的系统提示?
自动响应PC-Clocks脚本的交互式输入
问题背景
在使用PC-Clocks工具进行甲基化年龄加速分析时,calcPCClocks和calcPCClocks_Accel两个函数会触发交互式提示,分别需要手动输入SampleID和No。由于数据规模大无法全程监控,需要实现自动响应。
原执行脚本:
# 获取PC Clocks值及加速值 PCClock_DNAmAge <- calcPCClocks(path_to_PCClocks_directory = clocksDir, datMeth = datMeth, datPheno = datPheno) # 计算加速值需要datPheno中包含"Age"列(同PCGrimAge要求) PCClock_DNAmAge1 <- calcPCClocks_Accel(PCClock_DNAmAge)
触发的交互提示:
- 调用
calcPCClocks时:
To check whether datMeth and datPheno match up, type the column name in datPheno with sample names (or type skip): SampleID
- 调用
calcPCClocks_Accel时:
Do you want all of the GrimAge Components? (yes/no) No
解决方案
方法1:模拟标准输入流(无需额外依赖)
通过textConnection构造输入流,让函数自动读取预设的响应内容:
# 自动响应calcPCClocks的输入请求 PCClock_DNAmAge <- with(list(stdin = textConnection("SampleID\n")), { calcPCClocks(path_to_PCClocks_directory = clocksDir, datMeth = datMeth, datPheno = datPheno) }) # 自动响应calcPCClocks_Accel的输入请求 PCClock_DNAmAge1 <- with(list(stdin = textConnection("No\n")), { calcPCClocks_Accel(PCClock_DNAmAge) })
方法2:用mockery包模拟readline调用
如果函数内部通过readline获取输入,可以用mockery包替换readline的返回值:
# 安装并加载mockery包(仅首次使用需要安装) install.packages("mockery") library(mockery) # 模拟calcPCClocks的输入响应 with_mock(readline = function(...) "SampleID", { PCClock_DNAmAge <- calcPCClocks(path_to_PCClocks_directory = clocksDir, datMeth = datMeth, datPheno = datPheno) }) # 模拟calcPCClocks_Accel的输入响应 with_mock(readline = function(...) "No", { PCClock_DNAmAge1 <- calcPCClocks_Accel(PCClock_DNAmAge) })
注意事项
- 确保
datMeth、datPheno和clocksDir变量已正确定义,且datPheno中存在SampleID和Age列。 - 如果函数使用
scan而非readline获取输入,需调整模拟逻辑,例如为scan指定预设输入流。
内容的提问来源于stack exchange,提问作者Aaron Chen
相关产品推荐
相关产品推荐

