2011-11-18 97 views
0

我有一個更復雜的功能,我正在努力。我想在我的函數內部傳遞一個變量來做幾件事情。不工作的部分試圖訪問一個嵌入了我的變量名稱的對象。如何將字符串傳遞給R函數中的對象?

一個簡單的例子如下:

## 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

只需添加這行裏面,你function

mname.fit.lm <- get(paste(mname, ".fit.lm", sep = "")) 
+0

除了缺少一個括號外,這是它! mname.fit.lm < - get(paste(mname,「.fit.lm」,sep =「」))謝謝! – user918967

1

你正在向你的函數傳遞一個字符串。看起來你應該傳遞一個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) 
+0

我相信這是R Inferno推薦的方法。 –

1

由於Ramnath說,有時候人們解決這個問題get。但我同意JD,在這種情況下,您應該選擇一種更好的方式來存儲您的對象。另一個選擇是將它們存儲在一個指定列表中:

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) 
} 
相關問題