Почему я не могу передать набор данных в функцию? - PullRequest
7 голосов
/ 07 сентября 2010

Я использую пакет glmulti для подгонки моделей к нескольким наборам данных.Все работает, если я подгоняю один набор данных за раз.

Так, например:

output <- glmulti(y~x1+x2,data=dat,fitfunction=lm) 

работает просто отлично.

Однако, если я создаю функцию-обертку, как:

analyze <- function(dat)
{
out<- glmulti(y~x1+x2,data=dat,fitfunction=lm)
return (out)
}

просто не работает.Я получаю ошибку:

error in evaluating the argument 'data' in selecting a method for function 'glmulti'

Если нет фрейма данных с именем dat, он не работает.Если я использую results=lapply(list_of_datasets, analyze), это не сработает.Так что же дает?Без моей указанной оболочки я не могу просмотреть список наборов данных с помощью этой функции.Если у кого-то есть мысли или идеи о том, почему это происходит или как я могу обойти это, это было бы замечательно.

пример 2:

dat=list_of_data[[1]]
analyze(dat)

работает отлично,Таким образом, в некотором смысле он игнорирует аргумент и буквально ищет фрейм данных с именем dat.Он ведет себя одинаково, независимо от того, как я это называю.

1 Ответ

9 голосов
/ 07 сентября 2010

Я полагаю, что это еще одна проблема из-за определения окружения в дереве разбора методов S4 (одна из причин, почему я не большой поклонник S4 ...)

Это можно показать, добавив кавычки вокруг даты:

> analyze <- function(dat)
+ {
+ out<- glmulti(y~x1+x2,data="dat",fitfunction=lm)
+ return (out)
+ }
> analyze(test)
Initialization...
Error in eval(predvars, data, env) : invalid 'envir' argument

Прежде всего, вы должны отправить эту информацию сопровождающим пакета, поскольку они знают, как они взаимодействуют со средами внутри. Им придется адаптировать функции.

Очень грязный обходной путь для себя - поместить «dat» в глобальную среду и затем удалить его.

analyze <- function(dat)
{
assign("dat",dat,envir=.GlobalEnv)  # put the dat in the global env
out<- glmulti(y~x1+x2,data=dat,fitfunction=lm)
remove(dat,envir=.GlobalEnv) # delete dat again from global env
return (out)
}

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

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