在我的问题中,我需要根据给定的函数参数为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
)?
答案 0 :(得分:1)
给定整数i,j
和矩阵/ data.frame x
,找到m
以便:
x[i,m]; x[m,j]; x[m,m]
是相同的。到:
x[i,]; x[,j]; x[,]
这当然也适用于替换,即:
x[*] = value
并使用语法`[`
和`[<-`
或相关的do.call
。
如果您不想知道底层是什么,可以直接找到建议的解决方案。
由于`[`
和`[<-`
是函数,因此m
应被视为参数i, j
的缺失值。因此,应该创造一个“人为的”缺失值
在检查函数中的实际缺失值时会发生什么?
f=function(i,j){
cat ('A) '); print(match.call())
cat ('B) '); print(sys.call())
cat ('C)\n'); print(as.list(sys.call()))
}
当使用没有前面参数的逗号时,我们得到:
f(,2)
#A) f(j = 2)
#B) f(, 2)
#C)
#[[1]]
#f
#
#[[2]]
#
#
#[[3]]
#[1] 2
sys.call
列表的第二个元素似乎是空的!所以我们尝试捕获这个值:
f=function(a,b) as.list(sys.call())[[2]]
m=f(,)
和
m
Error: argument "m" is missing, with no default
......从来没有一个错误受到欢迎。
集:
m=(function(a,b) as.list(sys.call())[[2]])(,)
m
现在是人为缺失值。在子集化时,它像逗号附近的空白区域一样运行。事实上:
x=matrix(1:12, ncol=3)
x[m,m]
# [,1] [,2] [,3]
#[1,] 1 5 9
#[2,] 2 6 10
#[3,] 3 7 11
#[4,] 4 8 12
x[1, m ]
#[1] 1 5 9
x[m, 1 ]
#[1] 1 2 3 4
到目前为止,虽然更正式,但这种方法提供的不仅仅是回收欺骗x[T,T]
,x[1,T]
,x[T,1]
。但是,当解决方法不起作用时:
x=data.frame(x)
x[T,4:5]=0
#Error in `*tmp*`[[j]] : subscript out of bounds
人为缺失值起作用:
x[m,4:5]=0
x
# X1 X2 X3 V4 V5
#1 1 5 9 0 0
#2 2 6 10 0 0
#3 3 7 11 0 0
#4 4 8 12 0 0