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"