Почему я не могу передать набор данных функции?

Я использую пакет 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

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

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

> 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

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

A - самый грязный способ для себя, - это поместить "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: Для ясности это действительно самое худшее решение, но мне не удалось найти ничего лучшего. Если кто-то другой дает вам решение, в котором вам не нужно касаться вашей глобальной среды, обязательно используйте этот.