【发布时间】:2014-02-14 12:14:38
【问题描述】:
在我的问题中,我需要根据给定的函数参数将一些值分配给可能超出其界限的 data.frame。
要实现参数分配,可以定义:
ass=function(x,i,j,a){
# some operations on x,i,j,a
`[<-`(x,i,j,a)
}
或
ass=function(x,i,j,a){
# some operations on x,i,j
do.call(`[<-`, list(x,i,j,a))
}
当我需要模拟x[,j] 或x[i,] 时,问题就来了。在某些情况下TRUE 会起作用,即:
`[<-`(x,T,j,a); `[<-`(x,i,T,a)
就像:
x[,j]=a; x[i,]=a;
现在假设x 是n*3 data.frame,我可以毫无问题地分配越界,例如:
`[<-`(x,T,4,0)
仍然像
x[,4]=0
但是:
`[<-`(x,T,4:5,0)
给出“下标越界”错误,而
x[,4:5]=0
有效。
我如何“破解”符号"[<-"(x,i,j,a) 或do.call("[<-", list(x,i,j,a)) 以获取所有i(或所有j)?
【问题讨论】:
-
我很好奇。 参数子集是什么意思?
-
EDIT 要选择所有行或列,只需将参数留空,即
`[<-`(x,,4:5,0)。我猜想通过为尚不存在的行或列提供i或j参数,您正在尝试对不存在的列或行索引进行子集化。T值实际上被回收以匹配data.frame的i或j的长度,这就是它适用于确实存在的索引的原因。例如尝试`[<-`(x,c(T,F),1,0)将第一列的每隔一行设置为零。 -
@SimonO'Hanlon:问题是我应该将什么值传递为
i,以便它从x,i,j,a中消失?使用 TRUE 技巧,我可以使用ass(x,TRUE,j,a)或说ass(x,1,j,a)。目前我使用if重写x,i,j,a,如x,,j,a或x,i,,a。 -
@SimonO'Hanlon:另外,如果缺少 i(或 j),我该如何使用 do.call 方法?
do.call([, list(x,,j,a)) 不起作用。
标签: r variable-assignment assignment-operator