参数化子集和赋值

时间:2014-01-23 18:46:26

标签: r variable-assignment assignment-operator

在我的问题中,我需要根据给定的函数参数为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; 

现在假设xn*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)?

1 个答案:

答案 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