При создании alist, как извлечь тело функции во время выполнения - PullRequest
0 голосов
/ 02 апреля 2019

Совершенно новый для R, я пытаюсь найти ответы на этот вопрос, но, возможно, я не уверен, как сформулировать вопрос, так что извините, если это было задано ранее.

Я бы хотел разместить список функций / моделей для данных в цикле for, а не выполнять каждую из них вручную. Для этого мне нужно указать модель в alist, перечислить следующее:

flist <- alist(y ~ dnorm(mu, sigma),
               mu <- a + b*x,     # need to replace this line with general function
               a ~ dnorm(0, 100),
               b ~ dnorm(0, 10),
               sigma ~ dunif(0, 10)
)

Чтобы сделать это в цикле for, мне понадобится заменить a + b*x телом некоторой функции, выбранной во время выполнения. Вот я и подумал сделать это:

flist <- alist(y ~ dnorm(mu, sigma),
               mu <- body(function[i]),
               a ~ dnorm(0, 100),
               b ~ dnorm(0, 10),
               sigma ~ dunif(0, 10)
)

Однако, похоже, что alist на самом деле не оценивает body(function[i]), что, похоже, является частью точки alist. Есть ли способ вывести тело во время выполнения?

По сути, я хочу, чтобы часть выражения в alist была оценена (тело (...)), но не все (сохраняя оператор ~ / <- неоцененным). </p>

Возможно ли это сделать с помощью parse?

Ответы [ 2 ]

1 голос
/ 02 апреля 2019
  1. Используйте list вместо alist. Как вы заметили, весь смысл alist не в том, чтобы оценивать его аргументы.
  2. Не выполнять задание. Неясно, что вообще должна делать часть mu <-. Вы хотели использовать именованный аргумент или хотели указать зависимую переменную?

Это может быть тем, что вы хотите:

flist <- list(
    y ~ dnorm(mu, sigma),
    body(myfunction),
    a ~ dnorm(0, 100),
    b ~ dnorm(0, 10),
    sigma ~ dunif(0, 10)
)

Но неясно, как это будет использоваться. Я думаю, что вы, вероятно, хотите использовать что-то вроде этого вместо вашей второй строки:

mu ~ myfunction(somevar)

То есть вам нужна формула, которая использует myfunction.

1 голос
/ 02 апреля 2019

Я не уверен, что понимаю, но тебе нужно что-то подобное?

funs <- list(f1 = function(x) x + 3, f2 = function(x) 2 * x + 2)


flist <- alist(y ~ dnorm(mu, sigma),
        mu <- FUN_BODY,     # need to replace this line with general function
        a ~ dnorm(0, 100),
        b ~ dnorm(0, 10),
        sigma ~ dunif(0, 10))


flist[[2]] <- eval(substitute(substitute(ARG,
  list(FUN_BODY = body(funs[[2]]))),
  list(ARG = flist[[2]])))

# [[1]]
# y ~ dnorm(mu, sigma)
# 
# [[2]]
# mu <- 2 * x + 2
# 
# [[3]]
# a ~ dnorm(0, 100)
# 
# [[4]]
# b ~ dnorm(0, 10)
# 
# [[5]]
# sigma ~ dunif(0, 10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...