2014-03-26 17 views
0

Tracemem正在做我所需要的,但它也會產生令人分心的視覺混亂。這是一個簡單的例子。現在R:在功能中使用時,從tracemem中刪除視覺混亂

a<-1 
b<-2 

dummyfunction<-function(x,y){return(sum(x,y))} 
dummyfunction(a,b) 
[1] 3 

,我想要做的事比較複雜,首先tracemem看是否輸入重複的......

dummyfunction2<-function(x,y){if (tracemem(x)==tracemem(y)){return("Input vectors are identical")} 
    if(sum(x %in% y)>=length(x) & sum(y %in% x)>=length(y)){print("Something something.")} 
           return(sum(x,y))} 

此我想要做什麼,如果輸入重複的...

dummyfunction2(a,a) 
[1] "Input vectors are identical" 

當它們沒有重複時,雖然該功能仍然有效,但它會噴出一堆混亂的信息。

dummyfunction2(a,b) 
tracemem[0x0000000009824470 -> 0x000000000a7ced80]: match %in% dummyfunction2 
tracemem[0x0000000009824500 -> 0x000000000a7cedb0]: match %in% dummyfunction2 
tracemem[0x0000000009824500 -> 0x000000000a7cef90]: match %in% dummyfunction2 
tracemem[0x0000000009824470 -> 0x000000000a7cc1a8]: match %in% dummyfunction2 
[1] 3 

我希望說服非R用戶嘗試在這個問題上使用函數,這樣的輸出肯定會嚇跑他們。

什麼是最有效的方法來消除這種視覺混亂而不抑制潛在的信息性警告。等等,可能會在功能的其他部分出現?

回答

1

http://stat.ethz.ch/R-manual/R-patched/library/base/html/tracemem.html

「這樣的消息被打印每當內部碼拷貝對象時,此函數標記的對象。」

你可以堅持untracemem到函數繞過它:

dummyfunction3<-function(x,y){ 
if (tracemem(x)==tracemem(y)){return("Input vectors are identical")} 
untracemem(x) 
untracemem(y) 
if(sum(x %in% y)>=length(x) & sum(y %in% x)>=length(y)){print("Something something.")} 
return(sum(x,y))} 

輸出:

a <- 1 
b <- 2 
dummyfunction3(a,a) 
# [1] "Input vectors are identical" 
dummyfunction3(a,b) 
# [1] 3 
0

請勿使用tracemem()。相反,你可以嘗試pryr::address(),其中 只是返回輸入的內存地址。

devtools::install_github("hadley/pryr") 

library(pryr) 

x <- 1:10 
y <- x 

address(x) 
## [1] "0x100a568c8" 
address(y) 
## [1] "0x100a568c8"