gpt4 book ai didi

r - R 中的 rlang 中的 expr 和 exprs 类是不同的!为什么?

转载 作者:行者123 更新时间:2023-12-02 04:25:17 24 4
gpt4 key购买 nike

我不确定这里是否有人问过这个问题,但我在这里很困惑。我正在读这本很棒的书,名为《Advanced R》,作者为 Hadley Wickham,来自 here .

这里已经描述了一个名为cement的函数,我对其进行了一些修改并试图理解它。

library(rlang)
cement1 <- function(x) {
dots <- expr(x)
print(class(dots))
#paste(expr_name(x))
}

cement2 <- function(y,z) {
dots <- exprs(y,z)
print(class(dots))
#paste(purrr::map(dots, expr_name), collapse = " ")
}

在没有任何参数的情况下运行上面的cement1会返回点类作为“name”。

但是,当我使用附加参数运行 cement2 函数时,该类返回“list”,{简单地放置 class(expr(x)) 返回“name”,而 class(exprs(x) ) 返回“列表”}。

我不明白为什么它打印 exprexprs 返回的不同类。我认为我了解它们的唯一区别是,一个处理一个参数,另一个处理多个参数,但我可能是错的,我可能错过了一些细节。

原始问题:因此,这一切都是从分别运行这两个函数开始的,方法是删除 cement1cement2 代码中的注释部分>,当我运行这些函数时,以下是它们返回的输出:

cement1(Hello) #Returns , Error in type_of(.x) : object 'Hello' not found 
cement2(Hello) #Works very well and returns, [1] "y z"

所以我试图找到cement1失败的原因,然后打印他们的类,就在那时我意识到,exprexprs返回不同的类(class)。

我的问题是:

1)它们是设计使然吗?如果是,那么为什么?或者,我正在犯一些可怕的错误,但我目前无法看到。

2)如果cement1不能工作,正确的方法是什么?

很抱歉句子太长,我的母语不是英语,因此如果有任何愚蠢的地方,请告诉我,我会纠正它。我希望这不是重复的,我试图找到答案,但我自己找不到。

感谢您的帮助。

R 版本:3.4.2rlang:0.2.0

最佳答案

1) 是的,exprexprs 的返回值因设计而异。从 ?expr 帮助页面:

enexpr() and expr() capture a single raw expression.

enexprs() and exprs() capture a list of raw expressions including expressions contained in ....

2) expr_name() 需要一个带引号的表达式,例如 expr() 生成的表达式。因此,您需要修改 cement1 以在 dots 上调用 expr_name(),而不是 x。您还可以删除paste,因为您没有连接任何内容。

cement1 <- function(x) {
dots <- expr(x)
# print(class(dots)) ## Commented out for clarity
expr_name(dots) ## The input to expr_name is now effectively expr(x)
}
cement1( Hello )
# "x"

你的函数cement2基本上对exprs()返回的列表的每个元素调用expr_name(),然后将结果连接成一个单字符串。

2a) 既然我们已经让您的 cement1 正常工作,我们可以进一步改进它。目前,该函数未使用其输入参数xexpr() 只是捕获未计算的表达式,并且该表达式将始终为 x,无论您如何命名参数:

cement1.1 <- function( completelyIgnoredName ) {
dots <- expr(x)
expr_name(dots)
}
cement1.1( Hello )
# "x"

但是,如果将 expr() 替换为 enexpr(),该函数将替换作为函数参数提供的表达式并捕获那个而是:

cement1.2 <- function(x) {
dots <- enexpr(x)
expr_name(dots)
}
cement1.2( Hello )
# "Hello"

关于r - R 中的 rlang 中的 expr 和 exprs 类是不同的!为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50529163/

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