如何将函数中的字符串转换为对象?

时间:2011-11-19 18:07:23

标签: r

我想将我在函数中传递的字符串转换为对象(或列名)。

我知道这有效:

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函数。不幸的是,我失败了

5 个答案:

答案 0 :(得分:26)

诀窍是使用parse。例如:

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

另见此问答:Evaluate expression given as a string

答案 1 :(得分:6)

我刚刚得到一个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()处的初步努力因为不太了解parse使用“text”参数而感到困惑。)

答案 2 :(得分:1)

您可以使用assign运算符从字符串创建变量名称,如下所示: assign(“a_string”,NULL)

答案 3 :(得分:1)

除了eval(parse(text=YOUR_STRING))之外,您还可以使用as.symbol作为替代方案。

答案 4 :(得分:0)

这可能是R中的新功能,但是您可以将字符向量放在[的第二个位置,例如:

df <- data.frame(x = 1:5, y = 6:10)

selectCol <- "x"
df[, selectCol]

selectCol <- c("x", "y")
df[, selectCol]

selectCol <- "y"
df[, selectCol]

从问题标题开始,我认为这是在字符向量中声明一个变量,看起来像:

varName <- "x"
value <- NULL
assign(get("varName"), value)
print(x)