【问题标题】:R: How to use functions to generate part of function argumentsR:如何使用函数生成部分函数参数
【发布时间】:2021-01-16 15:27:35
【问题描述】:

我在使用 R 中的 stargazer 包将几个回归的回归结果一起呈现时提出了这个问题。假设我有 3 个(实际上我有更多)名称为 reg1、reg2、reg3 的回归。传统的观星方式是stargazer(reg1,reg2,reg3,(other options))

我想知道是否有任何方法可以生成所有“reg1 到 reg3”,然后使用输出替换 stargazer 参数中的部分。我尝试了类似sprintf("reg%d",seq(1:3)) 的东西。然而,Stargazer 似乎将输出简单地视为一个字符串。

我也试过eval(parse(text=cat(paste("stargazer(", paste(sprintf("reg%d",seq(1:3)),collapse = ","), ", type = \"text\")")))),但是R卡住了。

有没有办法让这个工作?谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    一种方法是使用do.callmget

    Base R do.call 为第一个参数创建一个函数调用,第二个参数的列表元素被转换为该函数的参数。

    mget 将从调用环境中的对象创建一个命名列表。在这种情况下,它会在全局环境中找到reg1reg2reg3,并将它们放入一个列表中。我们可以将mget 创建的列表与我们自己手动定义的列表与c 结合起来。

    do.call(stargazer, c(mget(sprintf("reg%d",seq(1:3))),other.parameters)))
    

    在这种情况下,other.parameters 应该是您要传递的其他参数的命名列表。例如

    other.parameters <- list(type = "latex")
    

    【讨论】:

    • 您好伊恩,谢谢您的回答。我尝试了您的解决方案,但 R 给出了错误消息“第二个参数必须是环境”。然后我发现正确的解决方案是do.call(stargazer, c(mget(sprintf("reg%d",seq(1:3))), other.parameters)),我认为您实际上是这个意思。非常感谢!
    【解决方案2】:

    尝试将第二个命令传递给 stargazer:

    reg_models <- sprintf("reg%d",seq(1:3)) %>% noquote()
    reg_models
    
    [1] reg1 reg2 reg3
    
    cat(paste(reg_models, collapse=", "))
    reg1, reg2, reg3
    

    【讨论】:

    • 嗨 Latlio,很抱歉,您的建议与我在原始问题中所做的非常相似。在 Ian 的帮助下,我找到了正确的方法。你可以参考他的回答和我的cmets。还是谢谢你们!
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2014-06-22
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多