首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在公式中引用不同环境中的对象

如何在公式中引用不同环境中的对象
EN

Stack Overflow用户
提问于 2022-11-13 23:02:04
回答 3查看 44关注 0票数 1

我使用的是fixest::feols(),我有一个函数,我想将一个参数传递给它,以便使用subset =参数对数据进行子集。但是,当继续获取错误时:The argument 'subset' is a formula whose variables must be in the data set given in argument 'data'.

我尝试了以下代码:

代码语言:javascript
复制
library(fixest)

cars <- mtcars

my_fun <- function(data, hp.c.off) {
  
  feols(mpg ~ disp + drat,
        data = data,
        subset = ~ hp > substitute(hp.c.off))
}

my_fun(data = cars, 150)

我的预期结果和输入的结果一样:

代码语言:javascript
复制
feols(mpg ~ disp + drat,
      data = cars,
      subset = ~ hp > 150)

我知道在将hp.c.off传递给公式之前,必须替换它的值。我们可以先创建字符串表达式,然后使用as.formula()来实现这一点,但是,我想知道是否有更好的方法以编程方式构建不需要先创建字符串表达式然后将其转换为公式的表达式。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-11-14 00:02:36

您可以使用rlang::new_formula(),使用rlang::expr()引用rhs和!!rlang::enexpr()来捕获和注入hp.c.off参数。

我没有安装最固定的程序,但这演示了如何在函数中构建公式:

代码语言:javascript
复制
library(rlang)

cars <- mtcars

my_fun <- function(data, hp.c.off) {
  new_formula(lhs = NULL, rhs = expr(hp > !!enexpr(hp.c.off)))
}

my_fun(data = cars, 150)
# ~hp > 150
# <environment: 0x1405e38>
票数 1
EN

Stack Overflow用户

发布于 2022-11-14 07:01:13

1)将公式创建为字符串,然后将其转换为公式。

代码语言:javascript
复制
my_fun <- function(data, hp.c.off) {
  
  feols(mpg ~ disp + drat,
        data = data,
        subset = as.formula(paste("~ hp >", hp.c.off)))
}

2)或者只是不使用subset=参数,而是在subset中使用data参数。

代码语言:javascript
复制
my_fun <- function(data, hp.c.off) {
  
  feols(mpg ~ disp + drat,
        data = subset(data, hp > hp.c.off))
}

3)或使用subset=可以是逻辑向量的事实

代码语言:javascript
复制
my_fun <- function(data, hp.c.off) {

  feols(mpg ~ disp + drat,
        data = data, 
        subset = data$hp > hp.c.off)
}
票数 2
EN

Stack Overflow用户

发布于 2022-11-13 23:14:25

简单选项是将表达式作为参数传递给函数。

代码语言:javascript
复制
my_fun <- function(data,expr = ~ hp > 150){
  
  feols(mpg ~ disp + drat,
        data = data,
        subset = expr)
}

-testing

代码语言:javascript
复制
> my_fun(data = cars)
OLS estimation, Dep. Var.: mpg
Observations: 13 
Standard-errors: IID 
             Estimate Std. Error   t value Pr(>|t|)    
(Intercept) 23.414923   8.019808  2.919636 0.015310 *  
disp        -0.021349   0.008284 -2.577276 0.027545 *  
drat        -0.201284   2.014207 -0.099932 0.922373    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
RMSE: 2.16851   Adj. R2: 0.300667
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74425436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档