2015-10-29 1 views
3

Я хочу применить функцию к списку моделей. Я хотел бы организовать вывод, указав название модели перед ее выходом. Вот (очень) упрощенный пример использования match.call() на основе this r-help thread:Получить аргументы из списка, переданного функции внутри функции

x <- rnorm(10) 
y <- rnorm(10) 
mod <- lm(y~x) 
fun <- function(model){ 
name <- as.character(match.call()[[2]]) 
p <- summary(model)$coefficients[2,4] 
return(paste(name, "; p =", p)) 
} 

Если я кормить его одной модели, она отлично работает:

> fun(model=mod) 
[1] "mod ; p = 0.901618595026321" 

Но если применить его к списку, по имени или нет, это не работает:

> lapply(list(mod, mod), fun) 
[[1]] 
[1] "[[ ; p = 0.901618595026321" "X ; p = 0.901618595026321" 
[3] "i ; p = 0.901618595026321" 

[[2]] 
[1] "[[ ; p = 0.901618595026321" "X ; p = 0.901618595026321" 
[3] "i ; p = 0.901618595026321" 

> lapply(list(modA=mod, modB=mod), fun) 
$modA 
[1] "[[ ; p = 0.901618595026321" "X ; p = 0.901618595026321" 
[3] "i ; p = 0.901618595026321" 

$modB 
[1] "[[ ; p = 0.901618595026321" "X ; p = 0.901618595026321" 
[3] "i ; p = 0.901618595026321" 

Для ясности, что я хочу:

[[1]] 
[1] "modA ; p = 0.901618595026321" 
[[2]] 
[1] "modB ; p = 0.901618595026321" 
+0

Шаг через 'lapply' кода после выполнения' отладки (удовольствие) '- вы увидите, что' match.call() [[2]] '' дает X [[я]] 'независимо - имена не передаются или не известны внутренним функциям функции. – thelatemail

+0

@thelatemail, это правда. Я пытаюсь понять, как получить имена, которые будут переданы и известны внутренним функциям функции. – gung

+0

Я думаю, что ответ Ландау ниже - самый разумный метод. – thelatemail

ответ

2

Есть причина, почему вы не хотите использовать lapply над именами в списке вместо этого?

fun2 = function(models, name){ 
    model <- models[[name]] 
    p <- summary(model)$coefficients[2,4] 
    return(paste(name, "; p =", p)) 
} 
mods = list(modA = mod, modB = mod) 
lapply(names(mods), fun2, models = mods) 
# [[1]] 
# [1] "modA ; p = 0.828746440943558" 

# [[2]] 
# [1] "modB ; p = 0.828746440943558" 
+0

Это очень умно. С небольшим количеством shoehorning это сработало. Большое спасибо. – gung

1

Попробуйте это,

mLst <- list(modA=mod, mobB=mod) 
p <- lapply(mLst, function(m) summary(m)$coefficients[2,4]) 
as.list(mapply(function(n,p) paste(n,p, sep=" ; "), names(mLst), p)) 
+0

К сожалению, это не сработает, учитывая то, что я на самом деле делаю. Примером может служить только то, с чем люди могут работать. Спасибо за вашу помощь, тем не менее. – gung

+0

Можете ли вы изменить свой вопрос или указать причины, по которым он не работает? – jMathew

+0

Боюсь, что я не могу вставить много кода. Функция, которую я пытаюсь написать, много происходит внутри, большинство из которых не относится к моему центральному вопросу. Может быть какой-то способ адаптировать это, но это не в моих силах. Я ценю ваши усилия. – gung

Смежные вопросы