R: Удалить визуальный беспорядок из tracemem при использовании в функции

Tracemem делает то, что мне нужно, но также производит отвлекающий визуальный беспорядок. Вот простой пример.

a<-1
b<-2

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

Теперь я хочу сделать что-то более сложное, первую трассировку, чтобы увидеть, дублированы ли входы...

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 попробовать использовать функцию с этой проблемой, и такой вывод, безусловно, отпугнет их.

Что является наиболее подходящим способом удалить этот визуальный беспорядок, не подавляя потенциально информативные предупреждения. и т.д., которые могут появиться в других частях функции?

2 ответа

Решение

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

"Эта функция отмечает объект так, что сообщение печатается всякий раз, когда внутренний код копирует объект".

Вы можете вставить unceracemem в функцию, чтобы обойти это:

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

Не использовать tracemem(), Вместо этого вы можете попробовать pryr::address() который просто возвращает адрес памяти ввода.

devtools::install_github("hadley/pryr")

library(pryr)

x <- 1:10
y <- x

address(x)
## [1] "0x100a568c8"
address(y)
## [1] "0x100a568c8"
Другие вопросы по тегам