注:如果可能的话,适用于字符串或其他数据类型。
有一般解决方案或“技巧”:
a <- 1
b <- 2
a <- a + b
b <- a - b
a <- a - b
对于整数,您可以使用对于字符串,这将起作用
a <- "one"
b <- "two"
a <- paste(a,b, sep = "")
b <- substr(a,0,nchar(a) - nchar(b))
a <- substr(a,nchar(b) + 1, nchar(a))
> a
# two
> b
# one
在基本包中拥有太多功能的好处是:即使这是一个坏主意,总会有一种做事的方法。
list2env(list(a = b, b = a), envir = .GlobalEnv)
无论
a
b
的类别是什么。 但是我重复一遍:这是一个坏主意。
开始A = 9
B = 5
A = A + B
然后
A is 14
B is 5
B = A - B
然后
A is 14
B is 9
A = A - B
恢复:
B(9)现在是A
实际上不是只使用第三个变量,而是更简单!
尽管以前的答案都很好而且很漂亮,但它们都占用了太多的空间!
因此,我在C中提出了一个更整洁的解决方案:
a = (b - a) + (b = a);
它与字符串无法使用,但是整数和浮点都可以正常工作。
它的工作原理:
int a = 5, b = 7;
a = (b - a) + (b = a);
/* turns into */
a = (7 - 5) + (b = 5);
/* b is now 5 */
a = 2 + 5;
/* a is now 7 */
这里的关键是解析表达式的顺序(从左到右)。因此,表达式中第一次出现
b的原始值替换,只有在此之后
B分配给
a.。
我意识到这是一个古老而已经回答的问题,但这也许对那里的人很有用
基于内森(Nathan)的帖子,以将可变SWAP保持在运行环境中:
x <- 10
y <- 20
list2env(list(x=y, y=x), envir=as.environment(environment()))
print(x)
print(y)
您可以临时存储值,也可以在其中进行分配。但是我不建议您只是为了展示另一种可能性。
list
使用临时变量可能更容易阅读,并且可能更具性能。
a <- 1
b <- 2
b <- list(a, a <- b)[[1]]
a
#[1] 2
b
#[1] 1
仅在修改的情况下副本,这两种方式都不会制作副本。为了证明这一点,您可以使用
a <- 1
b <- 2
. <- a
a <- b
b <- .
rm(.)
a
#[1] 2
b
#[1] 1
tracemem
对于我所知,没有内置的功能可以做到这一点,而且您无法在没有第三个变量的情况下交换两个变量。
a <- 1
b <- 2
tracemem(a)
#[1] "<0x55de722c7730>"
tracemem(b)
#[1] "<0x55de722c76c0>"
b <- list(a, a <- b)[[1]]
tracemem(a)
#[1] "<0x55de722c76c0>"
tracemem(b)
#[1] "<0x55de722c7730>"
a <- 1
b <- 2
tracemem(a)
#[1] "<0x55de722c7420>"
tracemem(b)
#[1] "<0x55de722c73b0>"
. <- a
a <- b
b <- .
rm(.)
tracemem(a)
#[1] "<0x55de722c73b0>"
tracemem(b)
#[1] "<0x55de722c7420>"
然后,您可以使用如下:
swap <- function(x,y) {
eval( parse( text = paste(
"swap_unique_var_a<-", substitute(x), ";",
substitute(x), "<-", substitute(y), ";",
substitute(y), "<-swap_unique_var_a") ), env=parent.frame() )
}
函数的两个参数
a<-1; b<-2;
swap(a,b)
print(a); print(b)
请参考本地框架中的两个变量,然后将其交换为创建临时性以做到这一点。
the the the the the the the the the the the the the。 假定Arguments
swap()
和swap()
在swap()
可能会使功能更强大,但我有点关注对性能的影响,尤其是在解释的语言中,例如R,而没有相当于内部的语言。
如果有兴趣 /时间,我将测试性能,看看是否可以使用更强大的版本。