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

Я хотел бы преобразовать строку, которую я передаю в функции, в объект (или имя столбца).

Я знаю, что это работает:

df <- data.frame(A = 1:10, B = 11:20)

test.function <- function(x)            
{
  z <- df[[x]]
  return(z)
}
test.function("A")

Я не хочу использовать оператор [[.]], Потому что иногда это непрактично или даже неприменимо. Я заинтересован в общем методе преобразования строки в «объект». Поэтому я попробовал следующее:

df <- data.frame(A = 1:10, B = 11:20)

test.function <- function(x)
{
  z <- get(paste("df$", x, sep = ""))
  return(z)
}
test.function("A")

или

df <- data.frame(A = 1:10, B = 11:20)

test.function <- function(x)
{
  z <- as.name(paste("df$", x, sep = ""))
  return(z)
}
test.function("A")

или

df <- data.frame(A = 1:10, B = 11:20)

test.function <- function(x)
{
  z <- df$as.name(x)
  return(z)
}
test.function("A")

Я также пытался поиграться с функциями parse, do.call и eval. К сожалению, я не смог

Ответы [ 4 ]

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

Хитрость заключается в использовании parse. Например:

> x <- "A"
> eval(parse(text=paste("df$", x, sep = "")))
 [1]  1  2  3  4  5  6  7  8  9 10

См. Также этот вопрос / ответ: Оценить выражение, заданное в виде строки

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

Я только что получил возражение, которое вернуло меня через 5 лет к этому вопросу. Я все еще думаю, что правильный ответ - [[, несмотря на просьбу ОП не использовать его, но вот способ одеть [[ в более функциональную «функцию».

df <-     structure(list(x = 1:3, y = 1:3), .Names = c("x", "y"), row.names = c(NA, 
-3L), class = "data.frame")

 test.function <- `[[`    # So simple, `test.function` now has all the features desired.
 df
 x y
 1 1
 2 2
 3 3
 test.function(df, "x")
#[1] 1 2 3

Или, если было бы желательно жестко написать код, извлекающий объект с именем 'df' из вызывающей среды, предложение, которое кажется сомнительным:

 test.df_txt <- function(var, dfn ='df' ){ get(dfn)[[var]] }
 test.df_txt("x")
#[1] 1 2 3

Оригинальный ответ (все еще не рекомендуется):

Вы можете обойти ограничения «$», если хотите использовать eval (parse (text = ...)):

 test.function <- function(x)  {
   z <- eval(parse( text=paste("df$", x, sep = "")), env=.GlobalEnv)
   return(z)
   }
test.function("A")
# [1]  1  2  3  4  5  6  7  8  9 10

НО ... гораздо лучше использовать "[[". (Мои первоначальные усилия по eval(parse() -ing застряли в том, что я не знал достаточно, чтобы использовать аргумент "text" для parse.)

1 голос
/ 30 сентября 2016

В дополнение к eval(parse(text=YOUR_STRING)) вы можете использовать as.symbol в качестве потенциальной альтернативы.

1 голос
/ 21 мая 2013

Вы можете создать имя переменной из строки, используя оператор присваивания, например: assign ("a_string", NULL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...