gpt4 book ai didi

r - (预)向函数工厂和内部提供变量

转载 作者:行者123 更新时间:2023-12-04 09:37:49 27 4
gpt4 key购买 nike

我正在阅读哈德利的 Advanced R并尝试一些东西。我正在尝试创建一个 lazy闭包函数返回一个带有提供的函数 data.frame在其环境中以及使用 with并且能够在以后提供额外的函数参数。

lazy <- function(dataframe, x) {
function(FUN, x, ...) {
with(dataframe, FUN(x = x, ...))
}
}

lz_factory <- lazy(mtcars, "mpg")

lz_factory(mean)
lz_factory(cor, y="hp")

所以我期待数据帧是它所在的函数环境的一部分( browser 看看确认)。但是,变量名 x不供应,我无法提供新变量 y当我使用 cor作为第一 FUN争论。这与向使用 non-standard evaluation (NSE) 的函数( with )提供字符有关.我想让哈德利叔叔为我感到骄傲,但我的翻箱倒柜 eval , parse , substitute所有返回的错误。这意味着我不完全了解 R 是如何处理事情的。我知道为什么它不起作用(NSE)但不知道如何使它起作用。这是错误:
> lz_factory(mean)
Error in FUN(x = x, ...) : argument "x" is missing, with no default

> lz_factory(cor, y="hp")
Error in is.data.frame(x) : argument "x" is missing, with no default

我想我可以使用替代品来解决它,因为哈德利在这里展示了 xyplot但这也失败了,如下所示:
lazy <- function(dataframe, default) {
function(FUN, x, ...) {
if (missing(x)) x <- default
eval(substitute(with(dataframe, FUN(x, ...))))
}
}

lz_factory <- lazy(mtcars, "mpg")

lz_factory(mean)
lz_factory(cor, y="hp")


> lz_factory(mean)
[1] NA
Warning message:
In mean.default("mpg") : argument is not numeric or logical: returning NA

> lz_factory(cor, y="hp")
Error in cor("mpg", y = "hp") : 'x' must be numeric

那么我怎样才能让这个懒惰的函数工作呢:
  • 用包围在环境中的数据框产生自己的函数
  • 如果需要,允许我提供 x,如果不需要,则使用最初提供的默认值
  • 允许我将未知变量传递给由 lz_factory 创建的函数

  • 最好我想让这个功能与 with 一起使用.如果这是不可能的,最好知道为什么。最后,如果不能使用 with我怎样才能使该功能运行?

    最佳答案

    这个功能怎么样

    lazy <- function(dataframe, ...) {
    pdots <- substitute(list(...))
    if(is.null(names(pdots)) || names(pdots)[1]=="") {
    names(pdots)[2]<-"x"
    }
    function(FUN, ...) {
    dots <- substitute(list(...))[-1]
    if (is.null(dots$x)) {
    dots$x <- pdots$x
    }
    with(dataframe, do.call(FUN, as.list(dots)))
    }
    }

    这允许您在不带引号的情况下使用 mtcars 中的变量名称。例如
    lz_factory <- lazy(mtcars, mpg)
    lz_factory(mean)
    # [1] 20.09062
    lz_factory(mean, x=hp)
    # [1] 146.6875
    lz_factory(cor, y=hp)
    # [1] -0.7761684

    在这里,我们使用了一些额外的替换来确保我们获得惰性求值并允许您使用不带引号的变量名。 with将负责评估表达式。我猜可能有一种方法可以简化这一点,但至少它似乎有效。

    关于r - (预)向函数工厂和内部提供变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24376954/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com