Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:在不使用第三个变量的情况下交换两个变量_R - Fatal编程技术网

R:在不使用第三个变量的情况下交换两个变量

R:在不使用第三个变量的情况下交换两个变量,r,R,我有两个变量(即): a对于整数,可以使用 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 a有一个通用的解决方案或“窍门”:

我有两个变量(即):


a对于整数,可以使用

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

a有一个通用的解决方案或“窍门”:

a <- 1
b <- 2

a <- a + b
b <- a - b
a <- a - b
a开始

然后

然后

结果:

A(5)现在是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的原始值替换,并且只有在该值之后,b才被指定给a


我意识到这是一个古老且已得到回答的问题,但就我所知,这可能对其他人有用。没有内置函数可以做到这一点,也没有通用的方法可以在没有第三个变量的情况下交换两个变量

但是,如果您正在寻找一个至少可以减少代码重复的函数,以下内容可能会有所帮助:

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

swap基本包中有太多函数的好处是:总有办法做一些事情,即使这是个坏主意

list2env(list(a = b, b = a), envir = .GlobalEnv)

无论
a
b
的类别是什么,这都是有效的。但是我重复一遍:这是一个坏主意。根据Nathan的帖子,为了在运行环境中保持变量交换:

x <- 10
y <- 20
list2env(list(x=y, y=x), envir=as.environment(environment()))
print(x)
print(y)

x一旦覆盖了一个变量,它的信息就消失了。所以,不,不是没有使用“黑客”,比如将它们存储在不同的环境中。也许你可以解释为什么你不想要一个临时变量。因为除此之外,你只能做一些“把戏”,比如现有的答案,它们只适用于数字,在可读性等方面也不“更好”。你也可以看看这个:使用一个变量a,b本身作为临时存储器怎么样?这是允许的吗?如果是这样,你可以做一些事情,比如
a为necro的帖子感到抱歉,但是我已经添加了另一个可能的答案。遗憾的是没有真正的交换
ab
操作符,但希望我提供的
swap()
函数能有所帮助。真的很棒!谢谢你能详细说明为什么这是个坏主意吗?我假设可读性,但性能也是一个问题吗?我不知道在
list2env
的引擎盖下会发生什么。如果给定了
envir
,则最终结果是使用命名列表使用列表的名称/值对在该环境中分配对象。这是个坏主意,因为(1)是的,阅读时很难理解,(2)玩环境很容易产生意想不到的后果。举个例子,我上面的代码犯了一个严重的罪行,即显式地分配给
.GlobalEnv
。如果一个脚本有此功能,那么没有其他脚本可以在不破坏环境的情况下为其提供源代码。欢迎使用堆栈溢出!感谢您提供这段代码片段,它可能会提供一些即时帮助。通过说明为什么这是一个很好的解决问题的方法,正确地解释它的教育价值,并将使它对未来有类似但不完全相同问题的读者更有用。请在你的答案中添加解释,并说明适用的限制和假设。上面帖子中的解决方案更简单。在R中,您可以编写
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 */
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)
list2env(list(a = b, b = a), envir = .GlobalEnv)
x <- 10
y <- 20
list2env(list(x=y, y=x), envir=as.environment(environment()))
print(x)
print(y)