Запуск пакета R, который ожидает интерактивного ввода неинтерактивно - PullRequest
0 голосов
/ 15 декабря 2018

Я немного новичок, когда дело доходит до программирования на R, поэтому, пожалуйста, прости меня, если это звучит очевидно или ошибочно.

Я использую пакет R под названием bcrm (который делает умные вещи для повышения дозыдля клинических испытаний на рак), и когда я запускаю его в интерактивном режиме, он запрашивает у меня ввод через терминал.

Я хотел бы иметь возможность запустить его неинтерактивно.Можно ли как-нибудь написать скрипт, который включает в себя не только команду для вызова пакета bcrm, но и ответ на вопросы, которые он задает впоследствии?

Редактировать 21 декабря 2018 года: вот код, который запрашивает у меняинтерактивный ввод.Я хотел бы поставить какой-то код после последнего бита (или, возможно, в пакетном скрипте 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

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Глядя на структуру данных возвращаемых значений, вы можете извлечь те же выходные значения, что и для параметра simulate = false, если вы, например, установите для simulate = True и nsims = 1

значение Настройка simulate = false.:

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

Настройка simulate = true и nsims = 1 дает:

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

возвращает 2, как и раньше, все остальные значения также совпадают.

0 голосов
/ 21 декабря 2018

Возможно, кто-то докажет, что я неправ (надеюсь, что да), но:

После попытки найти некоторые обходные пути, я думаю, что невозможно автоматически ввести ответы без изменения исходного кода пакета (или не найдя большогохак).

Фон

  1. Пакет bcrm использует стандартную функцию R readline для приема интерактивного ввода (см. исходный код, напримерфункция crm.interactive: https://github.com/cran/bcrm/blob/master/R/bcrm_0.4.7.R)

  2. readline работает только в интерактивном режиме (см. справку):

    При неинтерактивном использовании результат выглядит какесли ответ был RETURN и значение равно "".

  3. Если я попытаюсь выполнить ваш код в командной строке (Linux) с включенным «интерактивным» режимом (R --interactive < your_code.R) Я должен использовать перенаправление ввода для предоставления кода R и поэтому не могу перенаправить сам ввод (и я думаю, что он будет проигнорирован, поскольку readline не читает stdin, а console).

  4. Rscript --interactive -e 'source("your_code.R") тоже не работает (не принимает "- в"teractive "аргумент).

Таким образом, возможные решения требуют изменения исходного кода пакета, чтобы обеспечить альтернативу использованию readline для поддержки" интерактивных "ответов, например, из файла или файла.необязательный аргумент (пожалуйста, свяжитесь с автором, чтобы попросить изменить это).

Поскольку исходный код содержится в одном файле (см. https://github.com/cran/bcrm/blob/master/R/bcrm_0.4.7.R) Я полагаю, вы могли бы просто получить его после применения некоторых изменений,Например,

  1. , заменяя каждый вызов на readline() на my.readline()
  2. , реализуя функцию my.readline(), возвращая одну строку "row" для каждого нового вызова (вы можете взятьзначение из символьного вектора и запомните индекс последнего вызванного значения).

Пример:

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] ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...