如何在`+`之后将字符串作为独立参数传递?

阿米特·科利(Amit Kohli)

在将您标记为dup之前,我了解使用字符串作为函数参数,但是我的用例略有不同。我不需要在函数内部传递参数,我想在+(think ggplot2之后传递动态数量的参数

(注意:请不要格式化和删除外观精美的####,我将它们留在了里面,以便于简单起见,人们可以将代码复制粘贴到R中)。

这是我的过程:

####因此,让我们重现此示例:

library(condformat)
condformat(iris[c(1:5,70:75, 120:125),]) +
   rule_fill_discrete(Species) +
   rule_fill_discrete(Petal.Width) 

在此处输入图片说明

####我希望能够rule_fill_discrete()动态地传递这两个函数(在我的实际用例中,我有可变数量的可能输入,并且无法对其进行硬编码)。

####首先,创建一个泛化函数:

PlotSeries <- function(x){
   b=NULL
   for (i in 1:length(x)){
     a <- paste('rule_fill_discrete(',x[i],')',sep="")
     b <- paste(paste(b,a,sep="+")) 
     }
   b <- gsub("^\\+","",b)
   eval(parse(text = b))
 }

####与一个参数一起使用

condformat(iris[c(1:5,70:75, 120:125),]) +
   PlotSeries("Species")

####但是如果我们传递两个参数,则不会:

condformat(iris[c(1:5,70:75, 120:125),]) +
   PlotSeries(c("Species","Petal.Width"))

rule_fill_discrete(Species)+ rule_fill_discrete(Petal.Width)中的错误:二进制运算符的非数字参数

####如果我们分别打电话给每个人,它将起作用

condformat(iris[c(1:5,70:75, 120:125),]) +
   PlotSeries("Species") +
   PlotSeries("Petal.Width")

####这给了我们关于问题是什么的指示...当将rule_fill_discrete语句作为一个语句传递时,它不喜欢这样的事实让我们测试一下:

condformat(iris[c(1:5,70:75, 120:125),]) +
   eval(rule_fill_discrete(Species) +
          rule_fill_discrete(Petal.Width) )

rule_fill_discrete(Species)+ rule_fill_discrete(Petal.Width)中的错误:二进制运算符的非数字参数

####失败。但:

condformat(iris[c(1:5,70:75, 120:125),]) +
   eval(rule_fill_discrete(Species)) +
   eval(rule_fill_discrete(Petal.Width) )

####这有效。但是我们需要能够传递GROUP语句(这很重要)。因此,让我们尝试获取eval语句:

Nasty <- "eval(rule_fill_discrete(Species)) eval(rule_fill_discrete(Petal.Width))"

 condformat(iris[c(1:5,70:75, 120:125),]) + Nasty                   #### FAIL

误差在+.default(condformat(虹膜[C(1:5,70:75,120:125),]),讨厌):非数字参数二进制运算符

condformat(iris[c(1:5,70:75, 120:125),]) + eval(Nasty)             #### FAIL

错误+.default(condformat(iris [c(1:5,70:75,120:125),]),eval(Nasty)):二进制运算符的非数字参数

condformat(iris[c(1:5,70:75, 120:125),]) + parse(text=Nasty)       #### FAIL

错误+.default(condformat(iris [c(1:5,70:75,120:125),]),parse(text = Nasty)):二进制运算符的非数字参数

condformat(iris[c(1:5,70:75, 120:125),]) + eval(parse(text=Nasty)) #### FAIL

eval(rule_fill_discrete(Species))+ eval(rule_fill_discrete(Petal.Width))中的错误:二进制运算符的非数字参数

那么我们该怎么做呢?

格雷戈尔·托马斯(Gregor Thomas)

注意:此答案提供了针对旧版本的错误的解决方法condformat自此以来,该错误已得到修复,修复该错误后,请参见@zeehio对于当前版本的回答。


我认为您有两个主要独立的问题。这些都混在一起在您的帖子中。我将尝试重述并分别回答它们,然后将它们放在一起-目前尚无法完全解决,但会逐渐接近。

首先,让我们通过定义几个变量来保存一些输入:

ir = iris[c(1:5,70:75, 120:125), ]
cf = condformat(ir) 

问题1:如何+在向量或输入列表上使用?

这是一个简单的问题。base回答是Reduce以下都是等效的:

10 + 1 + 2 + 5 
"+"("+"("+"(10, 1), 2), 5)
Reduce("+", c(1, 2, 5), init = 10))

与您的情况更相关,我们可以这样做来复制您所需的输出:

fills = list(rule_fill_discrete(Species), rule_fill_discrete(Petal.Width))
res = Reduce(f = "+", x = fills, init = cf)
res

问题2:如何将字符串输入与配合使用rule_fill_discrete

这是我第一次使用condformat,但是它看起来像是lazyevalrule_fill_discrete_非标准评估的标准评估对应物以范式编写的rule_fill_discrete甚至在中提供了此示例?rule_fill_discrete,但无法正常工作

cf + rule_fill_discrete_(columns = "Species")
# bad: Species column colored entirely red, not colored by species
# possibly a bug? At the very least misleading documentation...

cf + rule_fill_discrete_(columns = "Species", expression = expression(Species))
# bad: works as expected, but still uses an unquoted Species

# other failed attempts
cf + rule_fill_discrete_(columns = "Species", expression = expression("Species"))
cf + rule_fill_discrete_(columns = "Species", expression = "Species")
# bad: single color still single color column

envSE函数中也有一个环境参数,但是我也没有运气。也许具有更多lazyeval/表达经验的人可以指出我忽略或做错的事情。

解决方法:我们可以做的是直接传递该列。之所以有效,是因为我们没有对列做任何花哨的功能,而只是直接使用它的值来确定颜色:

cf + rule_fill_discrete_(columns = c("Species"), expression = ir[["Species"]])
# hacky, but it works

把它放在一起

使用NSE版本Reduce很容易:

fills = list(rule_fill_discrete(Species), rule_fill_discrete(Petal.Width))
res = Reduce(f = "+", x = fills, init = cf)
res
# works!

通过将SE与输入字符串一起使用,我们可以使用棘手的解决方法。

input = c("Species", "Petal.Width")
fills_ = lapply(input, function(x) rule_fill_discrete_(x, expression = ir[[x]]))
res_ = Reduce(f = "+", x = fills_, init = cf)
res_
# works!

当然,这可以包装到一个自定义函数中,该函数将数据框和列名的字符串向量作为输入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在运行时将java中的字符串参数作为参数传递

来自分类Dev

如何在运行时将java中的字符串参数作为参数传递

来自分类Dev

如何在Javascript中使用任何引号将字符串作为参数传递

来自分类Dev

如何将二维数组类型字符(字符串)作为函数参数传递?

来自分类Dev

如何将JSON字符串作为查询参数传递给API Gateway

来自分类Dev

我如何将列表,数组或字符串作为参数传递给redshift

来自分类Dev

如何使用python将json字符串作为命令行参数传递

来自分类Dev

如何将constexpr字符串数组作为参数传递?

来自分类Dev

如何从Javascript将空字符串作为参数传递给MVC ActionMethod

来自分类Dev

如何将字符串作为参数传递给javascript函数

来自分类Dev

如何将字符串作为参数传递给`do.call`命令?

来自分类Dev

如何将字符串作为参数传递给JavaScript函数?

来自分类Dev

BASH:如何将数组中的字符串作为参数传递给命令?

来自分类Dev

如何将字符串变量作为全局参数传递给命令

来自分类Dev

如何将参数作为字符串传递给应该执行特定功能的外部

来自分类Dev

如何将字符串作为参数传递给需要R中的变量的函数

来自分类Dev

如何使用javascript将url地址字符串作为url的参数传递?

来自分类Dev

Python:如何将字符串作为函数的参数传递

来自分类Dev

如何将连接的字符串作为参数传递给函数:Angular 2

来自分类Dev

如何将 JSON 字符串作为请求参数传递给其他服务

来自分类Dev

如何将字符串变量作为参数传递给awk

来自分类Dev

如何将字符串作为关键字参数传递给方法

来自分类Dev

当我们使用winapis将字符串作为参数传递时,如何将c#字符串转换为c ++字符串

来自分类Dev

如何在glShaderSource中将字符串作为GLchar **(char **)参数传递?

来自分类Dev

如何在Handlebars帮助器表达式中将字符串作为参数传递?

来自分类Dev

如何在bash脚本中将字符串或变量作为awk的多个参数传递?

来自分类Dev

如何在URL中传递波斯字符串作为参数?

来自分类Dev

如何在CAPL中将字符串作为用户定义的函数参数传递

来自分类Dev

如何在C中将字符串作为参数传递给线程

Related 相关文章

  1. 1

    如何在运行时将java中的字符串参数作为参数传递

  2. 2

    如何在运行时将java中的字符串参数作为参数传递

  3. 3

    如何在Javascript中使用任何引号将字符串作为参数传递

  4. 4

    如何将二维数组类型字符(字符串)作为函数参数传递?

  5. 5

    如何将JSON字符串作为查询参数传递给API Gateway

  6. 6

    我如何将列表,数组或字符串作为参数传递给redshift

  7. 7

    如何使用python将json字符串作为命令行参数传递

  8. 8

    如何将constexpr字符串数组作为参数传递?

  9. 9

    如何从Javascript将空字符串作为参数传递给MVC ActionMethod

  10. 10

    如何将字符串作为参数传递给javascript函数

  11. 11

    如何将字符串作为参数传递给`do.call`命令?

  12. 12

    如何将字符串作为参数传递给JavaScript函数?

  13. 13

    BASH:如何将数组中的字符串作为参数传递给命令?

  14. 14

    如何将字符串变量作为全局参数传递给命令

  15. 15

    如何将参数作为字符串传递给应该执行特定功能的外部

  16. 16

    如何将字符串作为参数传递给需要R中的变量的函数

  17. 17

    如何使用javascript将url地址字符串作为url的参数传递?

  18. 18

    Python:如何将字符串作为函数的参数传递

  19. 19

    如何将连接的字符串作为参数传递给函数:Angular 2

  20. 20

    如何将 JSON 字符串作为请求参数传递给其他服务

  21. 21

    如何将字符串变量作为参数传递给awk

  22. 22

    如何将字符串作为关键字参数传递给方法

  23. 23

    当我们使用winapis将字符串作为参数传递时,如何将c#字符串转换为c ++字符串

  24. 24

    如何在glShaderSource中将字符串作为GLchar **(char **)参数传递?

  25. 25

    如何在Handlebars帮助器表达式中将字符串作为参数传递?

  26. 26

    如何在bash脚本中将字符串或变量作为awk的多个参数传递?

  27. 27

    如何在URL中传递波斯字符串作为参数?

  28. 28

    如何在CAPL中将字符串作为用户定义的函数参数传递

  29. 29

    如何在C中将字符串作为参数传递给线程

热门标签

归档