R:交换两个变量而无需使用第三个变量 我有两个变量(即): A

问题描述 投票:0回答:8
我想交换他们的价值观。是否有内置的R功能可以执行该操作?还是没有其他优雅的方式,不使用第三个(临时)变量?

注:
如果可能的话,适用于字符串或其他数据类型。

有一般解决方案或“技巧”: a <- 1 b <- 2 a <- a + b b <- a - b a <- a - b

there是一个有用的链接,可以解释很多:
r
8个回答
15
投票

对于整数,您可以使用

a = a + b b = a - b a = a - b

对于字符串,这将起作用

10
投票
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

6
投票
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 恢复:


3
投票

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

2
投票
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

2
投票
tracemem

对于我所知,没有内置的功能可以做到这一点,而且您无法在没有第三个变量的情况下交换两个变量。 

2
投票
,但是,如果您追求的功能至少可以减少代码重复,则以下内容可能会有所帮助:

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()

1
投票
环境中,因此在全球环境中重新创建了

swap()

环境中的变量。

可能会使功能更强大,但我有点关注对性能的影响,尤其是在解释的语言中,例如R,而没有相当于内部的语言。

如果有兴趣 /时间,我将测试性能,看看是否可以使用更强大的版本。  

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.