2011-11-18 94 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) 
} 
相关问题