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

Как я могу ссылаться на мой фрейм данных внутри функции при построении имени фрейма данных из нескольких строк?

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")

Возвращает «Ошибка в eval (paste0 (датафрейм, число, кавычка = FALSE)) [1,4]: неверное количество измерений»

Я пробовал несколько вещей внутри своей функции, но я не могу заставить R признать, что я пытаюсь передать ей мой фрейм данных. Как я могу это исправить?

1 Ответ

0 голосов
/ 29 апреля 2018

Вы можете использовать функцию 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. Номера строк и столбцов жестко закодированы в функции. Это может быть передано вызывающим абонентом.

Следовательно, функцию можно переписать и вызвать как:

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"
...