Как передать строку в объект внутри функции R? - PullRequest
0 голосов
/ 19 ноября 2011

У меня есть более сложная функция, над которой я работаю. Я хочу передать переменную внутри моей функции, чтобы сделать несколько вещей. Не работающая часть пытается получить доступ к объекту, в который встроено имя моей переменной.

Простой пример будет следующим:

    ## Annette Dobson (1990) "An Introduction to Generalized Linear Models".
    ## Page 9: Plant Weight Data.

    ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
    trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
    group <- gl(2,10,20, labels=c("Ctl","Trt"))
    weight <- c(ctl, trt)

    D9.fit.lm <- lm(weight ~ group)

    my.coeff <- function(mname)
       {
        b  <-  round(mname.fit.lm$coef[1],2)
        m  <-  round(mname.fit.lm$coef[2],4)
        r2 <-  round(summary(mname.fit.lm)$r.squared,2)

        cbind(b, m, r2)
       }

Так что, если я попробую этот фрагмент кода так:

 my.coeff("D9")

Тогда я получаю следующую ошибку:

 Error in my.coeff("D9") : object 'mname.fit.lm' not found

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

 cbind(round(D9.fit.lm$coef[1],2),round(D9.fit.lm$coef[2],4),round(summary(D9.fit.lm)$r.squared,2))
             [,1]   [,2] [,3]
 (Intercept) 5.03 -0.371 0.07

Спасибо!

Ответы [ 3 ]

3 голосов
/ 19 ноября 2011

Просто добавьте эту строку внутри себя function

mname.fit.lm <- get(paste(mname, ".fit.lm", sep = ""))
1 голос
/ 19 ноября 2011

Как говорит Рамнатх, иногда люди решают эту проблему с get.Но я согласен с JD, что в этом случае вы должны просто выбрать лучший способ хранения ваших lm объектов.Другой вариант - сохранить их в именованном списке:

fit.lm <- list()
fit.lm[["D9"]] <- lm(weight ~ group)

my.coeff <- function(mname)
{
    b  <-  round(fit.lm[[mname]]$coef[1],2)
    m  <-  round(fit.lm[[mname]]$coef[2],4)
    r2 <-  round(summary(fit.lm[[mname]])$r.squared,2)

    cbind(b, m, r2)
}
1 голос
/ 19 ноября 2011

вы передаете строку символов в вашу функцию. Похоже, вы должны передавать объект lm.

так как то так:

my.coeff <- function(mname)
{
  b  <-  round(mname$coef[1],2)
  m  <-  round(mname$coef[2],4)
  r2 <-  round(summary(mname)$r.squared,2)

  cbind(b, m, r2)
}

my.coeff(D9.fit.lm)
...