r - 在这种情况下应该避免附加吗?
问题描述
尽管有一些关于这个话题的问题(例如这个问题),但他们都没有回答我的特定问题(据我所知)。
假设我有一个依赖于很多参数的函数。出于演示目的,我选择了 3 个参数:
myfun <- function(x1, x2, x3){
some code containing x1, x2, x3
}
通常输入参数已经包含在 a 中list
:
xlist <- list(x1 = 1, x2= 2, x3 = 3)
我想myfun
使用包含在xlist
这样的输入运行:
myfun(xlist$x1, xlist$x2, xlist$x3)
然而,这似乎是一个太大的努力(因为大量的参数)。
所以我决定修改myfun
: 而不是所有的输入参数。它现在将整个列表作为一个输入:在我使用的代码的开头,attach
以便使用与上面相同的代码。
myfun2 <- function(xlist){
attach(xlist)
same code as in myfun containing x1, x2, x3
detach(xlist)
}
我认为这将是一个很好的解决方案,但很多用户建议不要使用attach
.
你怎么看?有什么论据更喜欢myfun
吗myfun2
?
提前致谢。
解决方案
我认为你最好使用do.call
. do.call
将接受一个列表并将它们转换为参数。
myfun <- function(x1, x2, x3){
x1 + x2 + x3
}
xlist <- list(x1 = 1, x2= 2, x3 = 3)
do.call(myfun, xlist)
这样做的好处是明确了参数是什么,这使得对代码进行推理、维护和调试变得更加容易。
这变得棘手的地方是它是否xlist
包含比函数所需的更多的值。例如,以下会引发错误:
xlist <- list(x1 = 1, x2 = 2, x3 = 3, x4 = 4)
do.call(myfun, xlist)
您可以通过将参数与形式匹配来规避这一点
do.call(myfun, xlist[names(xlist) %in% names(formals(myfun))])
它仍然有点打字,但如果你在谈论 10 多个参数,它仍然比xlist$x1, xlist$x2, xlist$x3
, 等容易得多。
LAP 也提供了一个有用的解决方案,但最好用于with
通话之外。
with(xlist, myfun(x1, x2, x3))
推荐阅读
- unity3d - 没有足够的空间来安装 Unity
- javascript - 如何更改 DOM 上类内的属性值?
- python - python 3中询问用户输入时如何让光标闪烁
- python - 即使不直接调用类的特殊方法,“if”是否也可以隐式访问它们?
- javascript - 如何根据 Django 中选择的语言更改我的内联样式
- mysql - information_schema 相关查询中的 MySQL 8.0.22 回归
- reactjs - 无法理解客户端路由
- python - 从 dict 获取具有最新日期时间戳的 id
- r - 创建归因模型时 R 中的 MarkovChain 包错误:错误!转换矩阵的行不是某个
- powershell - 优化 Get-ADUser 过滤器