如何将参数传递给subset()?

时间:2010-08-27 17:52:19

标签: r

我正在构建一个gui,它允许我通过单击各种因子名称来选择data.frame的子集。 收到用户输入后,如何将其传递给子集功能?

例如:我有一个数据帧df,其中包括时间列中的MORNING和EVENING以及列optype中的RECEIVE和SEND。从GUI我知道用户想要一个只包含RECEIVE操作的子集,所以我也有以下字符串:

RequestedFactor1等于“optype”
RequestedRelationship1等于“==”
RequestedValue1等于“RECEIVE”

我可以对这些字符串做什么来将它们传递给子集,这样我就会收到与调用子集(df,optype ==“RECEIVE”)相同的输出?

TIA

2 个答案:

答案 0 :(得分:5)

为此你可以使用eval-parse构造,但我再次警告说这实际上是棘手的事情。请仔细阅读有关这两个的帮助文件。所以在你的情况下,这变成:

subset(df,eval(parse(text=paste(RF1,RR1,RV1)))) 

举例说明一些棘手的部分:

> RF1 <- "optype"

> RR1 <- "=="

> RV1 <- "\"RECEIVE\""

> optype <- c("RECEIVE","Not")

> ifelse(eval(parse(text=paste(RF1,RR1,RV1))),1,0)
[1] 1 0

注意转义的引号(\“)。这是必要的,因为你想要测试一个字符串,而不是RECEIVE对象。或者你可以这样做:

> RF1 <- "optype"

> RR1 <- "=="

> RV1 <- "Text"

> optype <- c("RECEIVE","Not")

> Text <- "RECEIVE"

> ifelse(eval(parse(text=paste(RF1,RR1,RV1))),1,0)
[1] 1 0

答案 1 :(得分:4)

R中的比较运算符实际上是特殊函数,因此您可以使用do.call来运行函数,不需要eval和parse以及可能来自那里的潜在麻烦。 e.g:

rf1 <- 'Species'
rr1 <- '=='
rv1 <- 'setosa'

subset(iris, do.call(rr1, list( get(rf1), rv1 ) ) )

您需要“获取”变量,以便您拥有变量值而不是名称,其余的可以是字符串。