将表达式传递给函数中的curve()

本·博克

一位同事问我这个,我一直在努力。

假设我想定义一个函数,该函数将表达式(x^2为具体起见,假设表达式)作为参数并将该参数传递给curve()

如果我想以简单的方式做到这一点,我就跑步

curve(x^2,from=0,to=3)

而且效果很好。

假设我尝试设置一个包装函数(假设除了绘制曲线外,我还想在包装内部做其他事情):

f <- function(g) {
    curve(g,from=0,to=3)
}

如果我通过一个函数,这可以工作:

f(function(x) x^2)

如果我尝试通过x^2则失败,当R尝试计算表达式时:

f(x^2)
## Error in eval(expr, envir, enclos) (from #2) : object 'x' not found

我可以尝试通过substitute在函数内使用来阻止此情况

f0 <- function(g) {
    str(substitute(g))
    curve(substitute(g),from=0,to=3)
}
f0(x^2)
## language x^2
## Error in curve(substitute(g), from = 0, to = 3) (from #3) : 
##  'expr' must be a function, or a call or an expression containing 'x'

好的,这表明也许我应该尝试

f <- function(g) {
    h <- as.expression(substitute(g))
    str(h)
    curve(as.expression(substitute(g)),from=0,to=3)
}
f(x^2)
##  expression(x^2)
## Error in curve(as.expression(substitute(g)), from = 0, to = 3) (from #4) : 
##  'expr' must be a function, or a call or an expression containing 'x'

物有所值,

  • 失败与curve(h,...)(“h找不到功能”)不同
  • 如果as.call()被替换,它将以相同的方式失败as.expression()
  • curve() 在任何情况下都不适用于表达式:

curve(expression(x^2),from=0,to=1)
## Error in curve(expression(x^2), from = 0, to = 1) : 
##   'expr' did not evaluate to an object of length 'n'

如果我尝试调试curve()以查看发生了什么,我们有:

sexpr <- substitute(expr)
...
if (!((is.call(sexpr) || is.expression(sexpr)) && xname %in% 
    all.vars(sexpr))) 
    stop(...)

sexprsubstitute(g),未通过xname %in% all.vars(sexpr)测试...

关于如何处理的任何想法?

本·博克

我不是要先问再答,但我想出了一个答案,但又发现了一点点-在我看来,我还没有尝试过evaleval(curve(substitute(g),from=0,to=3))确实没有工作,但这样做:

f1 <- function(g) {
     eval(substitute(curve(g,from=0,to=3)))
}
f1(x^2)

更新:@RichardScriven建议也do.call()可以使用-而且确实可以!

f2 <- function(g) {
    do.call(curve,list(substitute(g),from=0,to=3))
}
f2(x^2)

欢迎进一步说明!

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将角度表达式传递给函数

来自分类Dev

将表达式传递给R中的自定义函数

来自分类Dev

将表达式传递给Thymeleaf中的“ include”属性

来自分类Dev

如何将表达式的变量传递给curve()作为方程式?

来自分类Dev

将表达式传递给lambda

来自分类Dev

将表达式传递给函数以在data.table中求值以进行内部优化

来自分类Dev

将表达式作为带引号的字符串传递给jumps包中的regsubsets()函数

来自分类Dev

将表表达式传递给表参数化的函数

来自分类Dev

如何将参数传递给在MVEL表达式内编写的函数?

来自分类Dev

Swift:尝试将元组传递给回调函数时出现“歧义表达式”

来自分类Dev

将逻辑运算符(和部分表达式)传递给函数参数Python

来自分类Dev

将Lambda表达式传递给模板函数时发生编译错误

来自分类Dev

如何将正则表达式作为参数传递给函数?

来自分类Dev

django 1.7如何将参数传递给函数正则表达式

来自分类Dev

将整个函数作为Lambda表达式传递给LINQ

来自分类Dev

将mysql连接传递给表达式路由中间件函数作为参数

来自分类Dev

将表达式传递给函数时,on.exit()回调已删除

来自分类Dev

将表表达式传递给表参数化的函数

来自分类Dev

django 1.7如何将参数传递给函数正则表达式

来自分类Dev

在嵌套函数中传递表达式

来自分类Dev

将生成器表达式传递给all()

来自分类Dev

将AngularJS表达式传递给PHP或Ajax替代

来自分类Dev

将未求值的表达式传递给C / C ++

来自分类Dev

将变量或表达式传递给`aes`

来自分类Dev

将表达式作为参数传递给Clojure REPL

来自分类Dev

如何将变量传递给Lambda表达式

来自分类Dev

将Lambda表达式传递给方法C#

来自分类Dev

将未求值的表达式传递给C / C ++

来自分类Dev

将表达式传递给IEnumerable Select

Related 相关文章

  1. 1

    将角度表达式传递给函数

  2. 2

    将表达式传递给R中的自定义函数

  3. 3

    将表达式传递给Thymeleaf中的“ include”属性

  4. 4

    如何将表达式的变量传递给curve()作为方程式?

  5. 5

    将表达式传递给lambda

  6. 6

    将表达式传递给函数以在data.table中求值以进行内部优化

  7. 7

    将表达式作为带引号的字符串传递给jumps包中的regsubsets()函数

  8. 8

    将表表达式传递给表参数化的函数

  9. 9

    如何将参数传递给在MVEL表达式内编写的函数?

  10. 10

    Swift:尝试将元组传递给回调函数时出现“歧义表达式”

  11. 11

    将逻辑运算符(和部分表达式)传递给函数参数Python

  12. 12

    将Lambda表达式传递给模板函数时发生编译错误

  13. 13

    如何将正则表达式作为参数传递给函数?

  14. 14

    django 1.7如何将参数传递给函数正则表达式

  15. 15

    将整个函数作为Lambda表达式传递给LINQ

  16. 16

    将mysql连接传递给表达式路由中间件函数作为参数

  17. 17

    将表达式传递给函数时,on.exit()回调已删除

  18. 18

    将表表达式传递给表参数化的函数

  19. 19

    django 1.7如何将参数传递给函数正则表达式

  20. 20

    在嵌套函数中传递表达式

  21. 21

    将生成器表达式传递给all()

  22. 22

    将AngularJS表达式传递给PHP或Ajax替代

  23. 23

    将未求值的表达式传递给C / C ++

  24. 24

    将变量或表达式传递给`aes`

  25. 25

    将表达式作为参数传递给Clojure REPL

  26. 26

    如何将变量传递给Lambda表达式

  27. 27

    将Lambda表达式传递给方法C#

  28. 28

    将未求值的表达式传递给C / C ++

  29. 29

    将表达式传递给IEnumerable Select

热门标签

归档