R адресная функция

Я использую address() функция в pryr пакет в R, и было интересно, если этот следующий результат следует ожидать...

x <- 1:10
add <- function(obj){address(obj)}
address(x)
# [1] "0x112d007b0"
add(x)
# [1] "0x11505c580"

т.е. 0x112d007b0!= 0x11505c580

Я надеялся, что они будут иметь одинаковое значение... есть ли способ настроить функцию add выше, чтобы убедиться, что он получает то же значение? т.е. получить адрес в родительской среде?

1 ответ

pryr:::address определяется как function(x) address2(check_name(substitute(x)), parent.frame()), Если вы заверните pryr:::address в другой функции его parent.frame() изменения. Например:

myfun = function() parent.frame()
myfunwrap = function() { print(environment()); myfun() }
myfun()
#<environment: R_GlobalEnv>
myfunwrap()
#<environment: 0x063725b4>
#<environment: 0x063725b4>
myfunwrap()
#<environment: 0x06367270>
#<environment: 0x06367270>  

В частности, если я не потерял его где-то, pryr::address Кажется, работает так:

ff = inline::cfunction(sig = c(x = "vector", env = "environment"), body = '
    Rprintf("%p\\n", findVar(install("x"), env));
    return(eval(findVar(install("x"), env), env)); //pryr::address does not evaluate
')  #this is not a general function; works only for variables named "x"
assign("x", "x from GlobalEnv", envir = .GlobalEnv)
ff1 = function(x) ff(x, parent.frame())
ff2 = function(x) ff1(x)

pryr::address(x)
#[1] "0x6fca100" 

ff(x, .GlobalEnv)
#0x06fca100
#[1] "x from GlobalEnv"
ff1(x)
#0x06fca100
#[1] "x from GlobalEnv"
ff1(x)
#0x06fca100
#[1] "x from GlobalEnv"
ff2(x)
#0x06375340
#[1] "x from GlobalEnv"
ff2(x)
#0x0637480c
#[1] "x from GlobalEnv"

Я не уверен, как это можно "исправить" (иногда может потребоваться вести себя так), кроме как делать что-то вроде:

add = pryr::address
add(x)
#[1] "0x6fca100"
Другие вопросы по тегам