如何引用R中函数内的对象?

时间:2018-04-29 17:33:03

标签: r function object dataframe eval

在从多个字符串构建数据框名称时,如何在函数内部引用我的数据框?

a <- c(1:6)
b <- c("05/12/2012 05:00","05/12/2012 06:00","06/12/2012 05:00",
   "06/12/2012 06:00", "07/12/2012 09:00","07/12/2012 07:00")
c <-c("0","0","0","1","1","1")
d <-c("12", "12", "13", "15", "16", "17") 
dataframenumber4 <- data.frame(a,b,c,d,stringsAsFactors = FALSE)

我想从我的数据框中选择一个值。

dataframenumber4[1,4] 

[1] 12

但我也想构建一个函数,因为我有多个想要选择的数据帧:

selectvalue <- function(dataframe, number){
paste0(dataframe,number)[1,4]
}

selectvalue("dataframe", "number4") 

[1] NA NA NA

我认为这不是正确的,因为R并不认识我的小字符串作为对象名称。所以我试着解决它:

 selectvalue <- function(dataframe, number){
eval(paste0(dataframe,number))[1,4]
}

selectvalue("dataframe", "number4")

返回&#34; eval中的错误(paste0(dataframe,number,quote = FALSE))[1,4]:维数不正确&#34;

我在我的功能中尝试了多项内容,但我无法让R认识到我试图将其设为数据帧。我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

您可以使用get函数按名称访问对象。 data.frame的名称是使用paste0(dataframe,number)准备的,然后您可以使用该名称调用get来访问数据帧。因此,您的功能可以写成:

selectvalue <- function(dataframe, number){
  get(paste0(dataframe,number))[1,4]

}

selectvalue("dataframenumber",4)
[1] "12"

上述功能符合OP的预期,但我建议该功能几乎没有改进:

  1. 数据帧的名称可以由调用者直接传递。无需在函数内准备数据帧的名称。
  2. 排&amp;列号在功能上是硬编码的。这可以由调用者传递。
  3. 因此,函数可以重写并调用为:

    selectvalue <- function(dataframe, rownum, colnum){
      get(dataframe)[rownum,colnum]
    
    }
    
    selectvalue(paste0("dataframenumber",4), 1 ,4)
    #[1] "12"
    selectvalue(paste0("dataframenumber",4), 2 ,2)
    #[1] "05/12/2012 06:00"