R 我可以删除。。。(点点)然后把它传下去?

R 我可以删除。。。(点点)然后把它传下去?,r,ellipsis,R,Ellipsis,是否可以从…中删除元素。。。然后通过。。。其他功能?我的前两次尝试都失败了: parent = function(...) { a = list(...) str(a) a$toRemove = NULL str(a) # attempt 1 child(a) # attempt 2 child( ... = a ) } child = function(...) { a = list( ... ) str(a)

是否可以从…中删除元素。。。然后通过。。。其他功能?我的前两次尝试都失败了:

parent = function(...)
{

   a = list(...)
   str(a)
   a$toRemove = NULL  
   str(a)

   # attempt 1   
   child(a)   

   # attempt 2
   child( ... = a )
}


child = function(...)
{
  a = list( ... )
  str(a)
}

parent( a = 1 , toRemove = 2 )
编辑
很抱歉搞混了。我修复了child()。目的是让孩子们列出

编辑2
这里有一个更真实的例子(但仍然相当简单,因此我们可以就此进行有用的对话)。父对象通过递归调用。父级需要知道递归调用的深度。父级之外的调用方不应该知道“深度”,也不应该在调用parent()时设置“深度”。Parent调用其他函数,在本例中为child()。儿童需要价值观。。。显然,子级不需要“深度”,因为父级生成它是为了自己使用

parent = function( ... )
{

   depth = list(...)$depth      
   if ( is.null( depth ) )
   {
       depth = 1
   }  
   print( depth )

   # parent needs value of depth to perform various calculations (not shown here)

   if ( depth == 5 )
   {
       return()
   }
   else
   {
      # child doesn't need "depth" in ...
      child( ... ) 
   }

   # yikes!  now we've added a second, third, etc. depth value to ...
   parent( depth = depth + 1 , ... )

}


child = function(...) 
{       
    # does some magic    
}

下面是一个如何从…中取出项目的示例。。。并删除一个元素,然后使用do.call调用下一个函数:

parent <- function(...){
   funArgs <-  list(...)
   str(funArgs)
   ## remove the second item
   newArgs <- funArgs[-2]
   str(newArgs)
   ## if you want to call another function, use do.call
   do.call(child, newArgs)
  }

child = function(...)
{
  cat("Don't call me a child, buddy!\n")
  a <- list(...)
  str(a)
}


parent(a=1, b=2, c=3)

parent处理这些事情的一种方法是将
child
函数包装在
parent
中,并使用一个定义,将您不想传递给
child
的任何参数放在
参数之后。例如:

parent <- function(...) {
    localChild <- function(..., toRemove) child(...)
    localChild(...)
}
child <- function(a) {
    a + 10
}

> parent(a = 1, toRemove = 10)
[1] 11

根据您的实际用例,
do.call()
可能与您的问题最接近。

您得到了一些很好的答案,但这里有一些简单的方法可以解决您的具体示例:

parent = function(...)
{

   a = list(...)
   str(a)
   a$toRemove = NULL  
   str(a)

   # attempt 1   
   child(a)   

   # attempt 2
   #child(...)
}

child = function(...)
{
    a <- as.list(...)   
    str(a)
}

parent( a = 1 , toRemove = 2 )
您的原始版本抛出了一个错误,因为
a
未在
child
中定义。然后,在
child
中简单地使用
as.list(…)
(而不仅仅是
list(…)
)似乎可以生成所需的输出。请注意,我仅在此处使用您的尝试1。

您的子函数错误。试一试

> child(a=1)
Error in str(a) : object 'a' not found
编辑:不再适用

这个。。。参数只能用于将参数传递给下一个函数。除非将参数转换为列表,否则无法从中轻松获取参数。因此,您的子函数可以是:

child <- function(...)
{
  mc <- match.call()  # or mc <- list(...)
  str(mc$a)
}
然后你可以做:

parent <- function(...){

   mc <- match.call()
   mc$toRemove <- NULL
   mc[[1L]] <- as.name("child")
   eval(mc)

}

我不认为列出的答案能解决问题,或者至少在我读到的时候不能。假设您想将一些参数(如“xmax”和“xmin”)作为实际变量传递给子(…)?
在child的环境中,它希望看到名为“xmax”和“xmin”的变量,而到目前为止给出的示例似乎并没有使这些变量可用。尝试插入一行,如

xmax-xmin -> xrange
然后它将抛出一个错误。
我认为,原始问题的全部要点是允许将可选“…”变量的子集传递给child()。您可以为简单的情况定制解决方案,例如sum(…),其中sum(unlist(the_modified_list))起作用。在更一般的情况下,我仍然看不到解决方案。我们可能需要将此问题提升到R-help邮件列表中


编辑:请参见

上的详细演示,我认为它没有那么复杂。尝试一下
funArgs答案中本应是注释的示例不是
list(…)
的失败,它正在调用
mean()
,并将list作为参数。我不知道
列表(…)
不起作用的情况。Gavin-如果父级在“…”之前有一些命名参数,我如何在do.call中传递这些参数?大概我必须把这些添加到“a”中?加文-对不起…我想问一下,是否有一些编程方法可以将其他命名参数添加到“a”中。显然,我可以手动添加它们,但如果我添加更多参数,我必须记住更新“a”@SFun28 yes;假设
parent()
有参数
x
y
、和
..
子(x,y,a)
,但没有
b
。摆脱如上所示的
b
点将我们的注释在以太网上交叉。一种方法可能是使用
match.call()
习惯用法。例如
foo@SFun28:请看我的答案。使用match.call时,请注意eval()工作的框架。lm()函数使用这个构造,但它会给出相当奇怪的结果。joran-child不应该知道“a”。child的目的只是列出“…”要测试toRemove是否已从…中删除…这是对Parents的输入抱歉…意识到我的子函数有错误。已修复。我的目的不是在子函数中有a,而是在…@SFun28的内容中列出我的道歉,我一定是误解了您要查找的内容。@SFun28我们的消息交叉了…这更有意义!我是doub我的答案正是你想要的,但考虑到你的编辑,它似乎至少在主题上足够了,我不会删除它…是的…让我们把这个答案留在这里,对于其他搜索topicJoris-fixed子函数的人来说会很有用。我的意思是将…转换为list和strthat@SFun28:我明白了。好吧,这让我的例子有点奇怪,但我还是根据Gavin的要求,将它留在这里,以说明match.call()的用法Joris-是的,请留在这里。这对社区来说是非常好的信息。Carl-我们无法访问xmin和xmax的原因是参数列表中没有明确指定它们。其目的是“还有一些其他参数我不需要,但我正在调用可能需要它们的函数”。如果child需要xmax,它会显式地将xmax列为一个参数。当然,child可以通过将…转换为listCarl来访问…中的xmax-感谢链接到我的博客文章。这描述了
localFoo()
我在回答中提到的习惯用法。这个特殊问答的一个问题是,不清楚OPs问题是具体的还是一般性的。我从一般的角度写下了我的答案。我仍然不太明白@SFun28真正想做什么-需要再次阅读评论。SFun28:child可能不需要xmax,但它甚至无法访问我的观点是,您不能使用现有的R函数作为“子”函数,因为该函数不会被设置
child <- function(a, ...){
    str(a,...)
}
parent <- function(...){

   mc <- match.call()
   mc$toRemove <- NULL
   mc[[1L]] <- as.name("child")
   eval(mc)

}
parent <- function(a=3, ...){
    ... (see above)
}
xmax-xmin -> xrange