Ответ 1
Хитрость заключается в использовании parse
. Например:
> x <- "A"
> eval(parse(text=paste("df$", x, sep = "")))
[1] 1 2 3 4 5 6 7 8 9 10
См. также этот Q/A: Оценить выражение, данное как строку
Я хотел бы преобразовать строку, передающую функцию в объект (или имя столбца).
Я знаю, что это работает:
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. К сожалению, я потерпел неудачу
Хитрость заключается в использовании parse
. Например:
> x <- "A"
> eval(parse(text=paste("df$", x, sep = "")))
[1] 1 2 3 4 5 6 7 8 9 10
См. также этот Q/A: Оценить выражение, данное как строку
Я только что получил upvote, который вернул меня через 5 лет на этот вопрос. Я все еще думаю, что правильный ответ [[
, несмотря на то, что запрос OP не использовать его, но вот способ нарядить [[
как более функциональную "функцию".
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
.)
В дополнение к eval(parse(text=YOUR_STRING))
вы можете использовать as.symbol
в качестве потенциальной альтернативы.
Вы можете создать имя переменной из строки с помощью оператора присваивания, как в: присваивать ( "a_string", NULL)