【问题标题】:Running an R package that expects interactive input non-interactively以非交互方式运行期望交互式输入的 R 包
【发布时间】:2018-12-15 11:36:50
【问题描述】:

我在 R 编程方面有点新手,所以如果这听起来很明显或被误导,请原谅我。

我正在使用一个名为 bcrm 的 R 包(它为癌症临床试验的剂量升级做了一些聪明的事情),当我以交互方式运行它时,它会通过终端询问我的输入。

我希望能够以非交互方式运行它。有什么方法可以让我编写一个脚本,其中不仅包括调用 bcrm 包的命令,还包括它随后提出的问题的答案?

2018 年 12 月 21 日编辑:这是要求我进行交互式输入的代码。我很想在提供输入的最后一点(或者可能在 DOS 批处理脚本中)之后放一些代码,其中包括输入一系列数字。

library(bcrm)

dose.levels <- c(1, 2, 3, 4)
prior.tox <- c(0.05, 0.1, 0.2, 0.3)
cohort.size <- 3
target.tox <- 0.33
max.size <- 6
prior.mean <- c(-0.5, 0.01)
prior.vcm <- matrix(c(0.5, 0.3, 0.3, 2), ncol=2)
prior.dist <- list(4, prior.mean, prior.vcm) 

tox.seq <- c(0, 0, 0)
dose.seq <- c(1, 1, 1)

mydata <- data.frame(patient = 1:3, dose=dose.seq, tox=tox.seq)




crm<-bcrm(dose = dose.levels,               # Dose levels
          p.tox0 = prior.tox,               # Prior probabilities of DLT
          target.tox = target.tox,          # Target tox level
          cohort = cohort.size,             # Cohort size
          stop = list(nmax = max.size),     # Stopping criteria
          ff = "logit2",                    # Model
          prior.alpha = prior.dist,         # Prior distribution on model parameter
          sdose.calculate = "median",       # How to calculate dose labels
          pointest = "plugin",              # How we will estimate DLT risks
          data = mydata,                    # Data so far
          simulate = FALSE,                 # Simulate lots of trials?
          method="rjags",                   # Calculation method
          truep = prior.tox,                # True probabilities, assume same as prior
          plot = TRUE)                      # Plot trial data as we go

【问题讨论】:

  • 顺便说一句,我应该提到我在 Windows 上运行它。
  • 我想说一个带有来自文件的输入重定向的 Windows 批处理文件(通过&lt;)可以工作,但会发现错误导致“隐藏的 UI”由于无效而停留在有点“锁定”状态或缺少输入将是调试的挑战。
  • 谢谢,我不太担心无效输入,因为我可以非常密切地控制输入,但我正在为如何实现它而苦苦挣扎。我已经按照您的建议尝试了几件事,但到目前为止没有成功。你能详细说明一下它是如何工作的吗?
  • 请在您的问题中添加minimal reproducible code example(您正在调用bcrm 的哪个函数,使用哪个手动捕获的数据,以便我们提供可重复的答案)。谢了!
  • 好的,我会编辑我的问题以添加代码

标签: r


【解决方案1】:

查看返回值的数据结构,您似乎可以提取与设置模拟 = 假相同的输出值,如果您设置模拟 = True 和 nsims = 1

例如 设置模拟 = false 给出:

crm$ndose[[1]][[1]] # returns [1] 2

设置模拟 = true 和 nsims = 1 给出:

crm[[1]]$ndose[[1]][[1]]

如前所述返回 2,所有其他值也相同。

【讨论】:

    【解决方案2】:

    也许有人证明我错了(我希望如此),但是:

    在尝试找到一些解决方法后,我认为在不更改包源代码(或找到大黑客)的情况下无法自动注入答案。

    背景

    1. bcrm 包使用标准 R 的 readline 函数来接受交互式输入(参见源代码,例如函数 crm.interactive: https://github.com/cran/bcrm/blob/master/R/bcrm_0.4.7.R

    2. readline 只能在交互模式下工作(参见帮助):

      在非交互式使用中,结果就像响应是 RETURN 并且值为 ""。

    3. 如果我尝试在启用“交互”模式 (R --interactive &lt; your_code.R) 的 (Linux) 命令行中执行您的代码,我必须使用输入重定向来提供 R 代码,因此不能重定向输入本身(并且我猜它会被忽略,因为readline 不是stdin,而是console)。

    4. Rscript --interactive -e 'source("your_code.R") 也不起作用(不接受“--interactive”参数)。

    因此,可能的解决方案需要更改包的源代码,以提供替代使用 readline 来支持“交互式”答案 e。 G。来自文件或可选参数(请联系作者要求更改)。

    由于源代码包含在一个文件中(请参阅https://github.com/cran/bcrm/blob/master/R/bcrm_0.4.7.R),我想您可以在应用一些更改后获取它,例如。 g.

    1. 将对readline() 的每次调用替换为my.readline()
    2. 通过为每个新调用返回单个字符串“行”来实现函数my.readline()(您可以从字符向量中获取值并记住最后调用值的索引)。

    例子:

    cur.answer = 0
    answers    = c("0", "1", "0")
    
    my.readline <- function() {
    
      cur.answer <<- cur.answer + 1  # use "global" variable!
      
      if (cur.answer <= length(answers))
        return (answers[cur.answer])
      
      return ("")  # default
    }
    
    my.readline()
    # [1] "0"
    my.readline()
    # [1] "1"
    my.readline()
    # [1] "0"
    my.readline()
    # [1] ""
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 2012-10-18
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2013-04-16
      相关资源
      最近更新 更多