微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有多选项参数的 base::formals [R]

如何解决带有多选项参数的 base::formals [R]

我尝试从函数 (randomForestSRC::rfsrc) 中提取所有参数及其认选项,以将其集成到另一个函数中。这就是我正在做的:

> mydata <- source("https://pastebin.com/raw/bL8ZHvbt")$value
> myparams <- list(ntree = 500,seed = 333)
> time = "OS"
> event = "Death"

# prepare vars
> aux <- formals(randomForestSRC::rfsrc)[-c(1,2,32,35)] #delete arguments I gonna manually add
> diffs <- setdiff(names(aux),names(myparams))
> method.params <- c(myparams,aux[diffs])

# run function
> f <- as.formula(paste0("Surv(",time,",event,") ~ ."))
> res <- do.call(randomForestSRC::rfsrc,c(list(formula = f,data = mydata),method.params))

Error in (function (formula,data,ntree = 1000,mtry = NULL,ytry = NULL,: 
  object 'samptype' not found

我猜错误提示是因为 rfsrc 的参数格式:它不是单个值而是多个选项......尽管只有一个作为认选项。

> aux$importance #default value for "importance" is "none"
c(FALSE,TRUE,"none","permute","random","anti")

> str(aux)
List of 31
 $ ntree      : num 1000
 $ nodedepth  : NULL
 $ splitrule  : NULL
 $ nsplit     : num 10
 $ importance : language c(FALSE,"anti")
 ...

我的问题是如何提取这个唯一的认值而不是整个选项字符串?提前致谢。

解决方法

这将允许您在与原始 rfsrc 环境相同的新函数中更改您试图设置为 500 和 333 的两个参数的默认值。 (你可以在原来的函数中这样做,但那似乎更危险。)

library(randomForestSRC)
rfsrc2 <- rfsrc
environment(rfsrc2) <- environment(rfsrc)
params <- formals(rfsrc)
myparams <- list(ntree = 500,seed = 333)
params[c("ntree","seed")] <- myparams 
    # more generally could have been `params[names(myparams)]` on LHS
formals(rfsrc2) <- params

str(rfsrc2)
#-------
function (formula,data,ntree = 500,mtry = NULL,ytry = NULL,nodesize = NULL,nodedepth = NULL,splitrule = NULL,nsplit = 10,importance = c(FALSE,TRUE,"none","permute","random","anti"),block.size = if (any(is.element(as.character(importance),c("none","FALSE")))) NULL else 10,ensemble = c("all","oob","inbag"),bootstrap = c("by.root","by.user"),samptype = c("swor","swr"),samp = NULL,membership = FALSE,sampsize = if (samptype == "swor") function(x) {
        x * 0.632
    } else function(x) {
        x
    },na.action = c("na.omit","na.impute"),nimpute = 1,ntime,cause,proximity = FALSE,distance = FALSE,forest.wt = FALSE,xvar.wt = NULL,yvar.wt = NULL,split.wt = NULL,case.wt = NULL,forest = TRUE,var.used = c(FALSE,"all.trees","by.tree"),split.depth = c(FALSE,seed = 333,do.trace = FALSE,statistics = FALSE,...)  

# test of "function"-ality
rfsrc2(formula=f,data=mydata)
                         Sample size: 100
                    Number of deaths: 11
                     Number of trees: 500
           Forest terminal node size: 15
       Average no. of terminal nodes: 4.464
No. of variables tried at each split: 3
              Total no. of variables: 6
       Resampling used to grow trees: swor
    Resample size used to grow trees: 63
                            Analysis: RSF
                              Family: surv
                      Splitting rule: logrank *random*
       Number of random split points: 10
                          Error rate: 58.9%

如果你想用 do.call 做到这一点,它可能是:

do.call( rfsrc2,list(formula=f,data=mydata) )

重要的是不要从formals-list中删除formuladata...,因为当函数体中的代码试图评估它们时,它们需要在那里.我很确定您不能使用 do.call 将它们粘贴回去(在删除它们之后)。您当然可以通过以下方式绕过整个过程:

do.call( rfsrc,data=mydata,ntree=500,seed=333) )

.... 但我知道你想要在函数本身之外的形式列表上进行手术的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?