Векторизация 'deparse (substitute (d))' в R? - PullRequest
0 голосов
/ 14 мая 2018

Мне интересно, почему при запуске моего ниже с помощью: bb(d = c(dnorm, dcauchy) ) я получаю сообщение об ошибке: object 'c(dnorm, dcauchy)' not found?

PS Но, как я покажу ниже, функция имеетнет проблем с bb(d = c(dnorm)).

bb <- function(d){

 d <- if(is.character(d)) d else deparse(substitute(d))

  h <- numeric(length(d))
for(i in 1:length(d)){
  h[i] <- get(d[i])(1)  ## is there something about `get` that I'm missing?
    }
  h
}
# Two Examples of Use:
bb(d = dnorm)                # Works OK 
bb(d = c(dnorm, dcauchy) )   # Error: object 'c(dnorm, dcauchy)' not found

# But if you run:
bb(d = c("dnorm", "dcauchy"))# Works OK

1 Ответ

0 голосов
/ 14 мая 2018

Попробуйте эту альтернативу, когда вы передаете функции непосредственно вашей функции

bb <- function(d){
  if (!is.list(d)) d <- list(d)
  sapply(d, function(x) x(1))  
}

bb(d = list(dnorm, dcauchy))
bb(d = dnorm)

Функция c() предназначена для объединения векторов, это не волшебная функция "массива" или что-то еще. Если у вас есть коллекции простых атомарных типов, вы можете объединить их с помощью c(), но для более сложных объектов, таких как функции, вам нужно собирать их в список, а не в вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...