Я только что получил возражение, которое вернуло меня через 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
.)