2015-09-11 2 views
0

Вот очень легкий пример того, что я хочу сделать.набор данных.table по ссылке внутри функции

test <- data.table(a=c(1,2,3),b=c(4,5,6)) 

f1 <- function(){ 
    test2 <- data.table(a=c(4,5,6),b=c(1,2,3)) 
    test <- copy(test2) 
} 

f1() 

> test 
    a b 
1: 1 4 
2: 2 5 
3: 3 6 

Я хотел бы, чтобы скопировать test2 в test по ссылке непосредственно в функцию f1() так, что выход будет

> test 
    a b 
1: 4 1 
2: 5 2 
3: 6 3 

Я знаю, что <- делает копию, я хотел бы сделать то же, копирование таблицы данных, но по ссылке. Есть ли способ сделать это возможным?

Спасибо всем!

ответ

3

Копирование по ссылке оксюморон в этом контексте (где "копия" имеет отчетливый адрес памяти).

В настоящее время замена содержимое data.table по ссылке не может быть сделано для произвольных data.tables, так как there is no way of modifying the number of rows (который может быть различным в test и test2) путем ссылки.

В частном случае заменяя data.table с другим, имеющим такое же количество строк ...

(test <- data.table(x=1:3)); address(test) 
# x 
# 1: 1 
# 2: 2 
# 3: 3 
# [1] "0000000016286280" 

f1 <- function(){ 
    test2 <- data.table(y=LETTERS[1:3]) 

    test[, names(test2) := test2] 
    test[, setdiff(names(test),names(test2)) := NULL] 
} 

f1() 
test; address(test) 
# y 
# 1: A 
# 2: B 
# 3: C 
# [1] "0000000016286280" 

Существует, вероятно, дождевик способ достижения этой цели, но я не уверен, что это что нужно сделать для начала.

+1

Спасибо за разъяснение Фрэнк, я ценю это. В моем конкретном примере, как 'test', так и' test2' имеют одинаковое количество строк, поэтому я буду использовать ваше предложение. –

-2

Просто возвратите из f1

f1 <- function(){ 
    test2 <- data.frame(a=c(4,5,6),b=c(1,2,3)) 
    return(test2) 
} 

через

test <- f1() 

уступая

> test 
    a b 
1 4 1 
2 5 2 
3 6 3 
Смежные вопросы