【问题标题】:Refer function arguments with string names in R在 R 中使用字符串名称引用函数参数
【发布时间】:2016-06-02 15:03:31
【问题描述】:

下面是我想要的一个简单示例:

“DF1”是具有两个变量“V1”和“V2”的数据框,所以我可以得到简单的ggplot函数作为流:

ggplot(DF1,aes(x=V1,y=V2))+geom_line()

现在,如果我有以下两个字符串:

name1="V1"
name2="V2"

上面的ggplot代码中有没有办法用name1和name2替换V1和V2?我尝试使用 do.call 但没有成功。我觉得我需要类似公式的目标来做到这一点。

【问题讨论】:

  • 仅在情节中? setNames before plot 可能会起作用
  • 感谢您的评论。你的意思是像 setNames(V1, "name1") 还是 setNames(DF1$V1, "name1")?我试过了,还是不行。

标签: r ggplot2


【解决方案1】:

我会沿线使用plyr 重命名列

library(plyr)
DF1 <- rename(DF1, c("V1" = "name1"))

或者我更喜欢的方式,使用data.table

require(data.table)
DT <- as.data.table(DF1)
setnames(DT, "V1","name1")

然后

ggplot(DT, aes(x=name1,y=name2))+geom_line()

使用设置为 V1 等的列通常会适得其反并且容易出错

更新

一些讨论Named columns renaming

【讨论】:

  • 感谢您的帮助@Severin Pappadeux。 baptiste 的方法更简单,所以我把功劳归功于他。
【解决方案2】:

我只是发现 get() 会起作用!

ggplot(DF1,aes(x=get(name1),y=get(name2)))+geom_line()

【讨论】:

  • 建议:不要使用get
  • 这是为什么呢?我以前从未使用过它
  • 一般来说,使用getassign 是一个明显的信号,表明你正在尝试按照另一种语言的模式做某事,而在R 中会有更自然、更优雅、更安全的方法来“获得”相同的结果。与fortunes::fortune(236) 密切相关。本质上,R 鼓励使用词法范围进行函数式编程,而当您将变量保存在全局环境(工作区)中时,经常使用get。 [这里不完全是这样,但无论如何]
【解决方案3】:

R base 更改列名:

colnames(DF1)[colnames(DF1)=="V1"] <- "Name 1"

【讨论】:

    【解决方案4】:

    标准答案是

     aes_string(x=name1, y=name2)
    

    (肯定是重复的)

    【讨论】:

    • 谢谢@baptiste 看来我没有用正确的关键字进行最有效的搜索
    • 我也找不到重复的(虽然这是一个常见问题解答),很难搜索
    猜你喜欢
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2014-04-05
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多