标签: assign

在R中,如何使函数内的变量可用于此函数内的较低级函数?(with,attach,environment)

更新2 @G.格洛腾迪克发布了两种方法.第二个是改变函数内的函数环境.这解决了我的编码重复过多的问题.在将脚本编写成包时,我不确定这是否是通过CRAN检查的好方法.当我得出一些结论时,我会再次更新.

更新

我试图传递很多输入参数变量,f2并且不想索引函数内的每个变量env$c, env$d, env$calls,这就是我尝试使用within f5f6(修改过f2)的原因.但是,assign不能在with里面工作{},移动assign到外面with会做的工作,但在我的实际情况下,我有几个assigns在with表达式内,我不知道如何with轻松地将它们移出功能.

这是一个例子:

## In the <environment: R_GlobalEnv>
a <- 1
b <- 2
f1 <- function(){
    c <- 3
d <- 4
f2 <- function(P){
    assign("calls", calls+1, inherits=TRUE)
    print(calls)
    return(P+c+d)
 }
calls <- 0
v <- vector()
for(i in 1:10){
    v[i] <- f2(P=0)
    c <- c+1
    d …
Run Code Online (Sandbox Code Playgroud)

r function environment-variables with-statement assign

24
推荐指数
1
解决办法
2万
查看次数

AngularJS:从ng-repeat动态分配控制器

我正在尝试为包含的模板动态分配控制器,如下所示:

<section ng-repeat="panel in panels">
    <div ng-include="'path/to/file.html'" ng-controller="{{panel}}"></div>
</section>
Run Code Online (Sandbox Code Playgroud)

但Angular抱怨说这{{panel}}是不确定的.

我猜,{{panel}}是不是定义尚未(因为我可以附和了{{panel}}在模板中).

我已经看到很多人设置ng-controller等于变量的例子如下:ng-controller="template.ctrlr".但是,如果没有创建重复的循环循环,我无法弄清楚如何{{panel}}ng-controller需要时获得可用值.

PS我也尝试ng-controller="{{panel}}"在我的模板中设置(认为​​它必须已经解决),但没有骰子.

javascript controller dynamic assign angularjs

22
推荐指数
4
解决办法
2万
查看次数

JavaScript中的`x = y,z`逗号分配

可能重复:
Javascript语法:逗号是什么意思?

我在阅读本文时遇到了代码(执行Ctrl+ F搜索Andre Breton):

//function returning array of `umbrella` fibonacci numbers
function Colette(umbrella) {
  var staircase = 0, galleons = 0, brigantines = 1, armada = [galleons, brigantines], bassoon;
  Array.prototype.embrace = [].push;

  while(2 + staircase++ < umbrella) {
    bassoon = galleons + brigantines;
    armada.embrace(brigantines = (galleons = brigantines, bassoon));
  }

  return armada;
}
Run Code Online (Sandbox Code Playgroud)

什么是x = (y = x, z)结构是什么意思?或者更具体地说,是什么y = x, z意思?我称之为逗号分配,因为它看起来像赋值并且有逗号.

在Python中,它意味着元组解包(或在这种情况下打包).这是同样的情况吗?

javascript variable-assignment assignment-operator assign iterable-unpacking

21
推荐指数
3
解决办法
7635
查看次数

R中的懒惰评估是否受到影响?

我读了这个关于重命名对象的基本问题和@Shane对它的回答,指着我懒惰的评价.现在我想知道是否assign也懒得评价.就像这里一样:

assign("someNewName",someOldObject)
rm(someOldObject)
Run Code Online (Sandbox Code Playgroud)

为什么我想知道这样做的原因是以下用例:假设我有10K + R对象各自有两个属性叫originalNameadditionalName.现在我想编写一个函数,可以有效地让用户从一个名称切换到另一个名称,而不会丢失这两个属性.粗略喜欢这个......

编辑:基于@Hadley的输入我改变了我的代码.

switchObjectName <- function(x) {
  n1 <- attributes(x)$originalName
  n2 <- attributes(x)$additionalName
  objName <- deparse(substitute(x))
  if(objName == n1) {
    delayedAssign(n2,x,assign.env=.GlobalEnv)
  } else {
    delayedAssign(n1,x,assign.env=.GlobalEnv)
  }
  rm(list=c(objName),envir=.GlobalEnv)    
}
Run Code Online (Sandbox Code Playgroud)

这种方法效果很好,但是我说这rm句话是正确的.rm(objName,envir=.GlobalEnv)虽然objName肯定是一个字符因为它是结果,但我试过但是无法使它工作deparse(substitute(x).

r lazy-evaluation assign

21
推荐指数
1
解决办法
1297
查看次数

如何使函数在函数内部可用

我创建了一个生成矩阵的函数,但是我无法弄清楚如何在函数环境之外使这个函数的输出可用,所以我可以将它保存在csv文件中.

我的功能代码如下:

创建了从特定网站获取网址并返回网页标题的功能:

getTitle <- function(url) {
  webpage <- readLines(url)
  first.row <- webpage[1]
  start <- regexpr("<title>", first.row)
  end <- regexpr("</title>", first.row)
  title <- substr(first.row,start+7,end-1)
  return(title)
}
Run Code Online (Sandbox Code Playgroud)

创建了一个函数,它接受url的向量并返回带有url和页面标题的n*2矩阵:

getTitles <- function(pages) {
  my.matrix <- matrix(NA, ncol=2, nrow=nrow(pages))
  for (i in seq_along(1:nrow(pages))) {
    my.matrix[i,1] <- as.character(pages[i,])
    my.matrix[i,2] <- getTitle(as.character(pages[i,])) }
  return(my.matrix)
  print(my.matrix)}
Run Code Online (Sandbox Code Playgroud)

http://goo.gl/D9lLZ上的示例文件上运行此函数后,我使用read.csv函数导入并命名为"mypages",我得到以下输出:

getTitles(mypages)
     [,1]                                               [,2]                                                
[1,] "http://support.google.com/adwords/answer/1704395" "Create your first ad campaign - AdWords Help"      
[2,] "http://support.google.com/adwords/answer/1704424" "How costs are calculated in AdWords - AdWords Help"
[3,] "http://support.google.com/adwords/answer/2375470" "Organizing …
Run Code Online (Sandbox Code Playgroud)

r function global-variables environment-variables assign

20
推荐指数
4
解决办法
4万
查看次数

R:分配数据框列的变量标签

我正在努力使用data.frame列的变量标签.假设我有以下数据框(更大的数据框的一部分):

data <- data.frame(age = c(21, 30, 25, 41, 29, 33), sex = factor(c(1, 2, 1, 2, 1, 2), labels = c("Female", "Male")))
#
Run Code Online (Sandbox Code Playgroud)

我还有一个带有该数据框变量标签的命名向量:

var.labels <- c(age = "Age in Years", sex = "Sex of the participant")
Run Code Online (Sandbox Code Playgroud)

我想在分配变量标签var.labels在数据帧中的列data使用功能labelHmisc包.我可以像这样一个接一个地做,然后检查结果:

> label(data[["age"]]) <- "Age in years"
> label(data[["sex"]]) <- "Sex of the participant"
> label(data)
                 age                      sex
      "Age in years" "Sex of the participant"
Run Code Online (Sandbox Code Playgroud)

变量标签被指定为列的属性:

> attr(data[["age"]], "label")
[1] "Age in years"
> …
Run Code Online (Sandbox Code Playgroud)

r labels dataframe assign hmisc

20
推荐指数
3
解决办法
5万
查看次数

更新Matlab结构数组的每个元素中的一个字段

假设我有一个struct数组arr,其中每个元素都有一堆字段,包括一个字段val.我想将每个元素的val字段增加一些常量,如下所示:

for i = 1:length(arr)
    arr(i).val = arr(i).val + 3;
end
Run Code Online (Sandbox Code Playgroud)

这显然有效,但我觉得应该有一种方法可以在一行代码中执行此操作(并且没有for循环).我想出的最好的是两行,需要一个临时变量:

newVals = num2cell([arr.val] + 3);
[arr.val] = deal(newVals{:});
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢.

arrays matlab struct field assign

19
推荐指数
1
解决办法
1万
查看次数

R:从包中覆盖函数的正确方法是什么?

我正在使用R包,其中有2个函数f1和f2(f2调用f1)
我希望覆盖函数f1.

由于R 2.15和包中命名空间的强制使用,如果我只是获取新函数,它确实可以在全局环境中使用(即在控制台中只调用f1(x)返回新结果).但是,调用f2仍将使用打包的函数f1.(因为命名空间修改了搜索路径,并按照"写入R扩展"教程中的说明对其进行了封装)
将f1替换为新命令的正确方法是什么?(除了再次构建包装!)这在几种情况下都很有用.例如,如果包中存在您尚未开发的错误.或者,如果您不想在日常开发过程中重新构建软件包.

我知道功能

assignInNamespace("f1",f1,ns="mypackage")
Run Code Online (Sandbox Code Playgroud)

但是,帮助页面?assignInNamespace有点令人讨厌,并且似乎不鼓励人们在不提供更多信息的情况下使用它,我在官方CRAN教程中找不到任何最佳实践建议.并在调用此函数后:

# Any of these 2 calls return the new function
mypackage::f1 
getFromNamespace(x = "f1", envir = as.environment("package:mypackage"))

# while this one still returns the old packaged version
getFunction(name = "f1", where = as.environment("package:mypackage")) 
Run Code Online (Sandbox Code Playgroud)

这非常令人不安.搜索路径如何受到影响?

现在我正在做一些丑陋的事情,比如修改lockEnvironment函数,这样library就不会锁定包命名空间,一旦我替换了f1,我可以在以后锁定它(这似乎不是一个好习惯)

所以基本上我有两个问题:

  1. assignInNamespace在包命名空间(应该被锁定)的情况下究竟做了什么
  2. 有什么好的做法?

非常感谢您在那里分享您的经验.

编辑:对此问题感兴趣的人可能会发现此博客文章非常有趣.

namespaces r package assign

19
推荐指数
2
解决办法
4238
查看次数

PHP将所有对象属性复制到此

我有一个PHP类型的对象MyObject.

$myObject instanceof MyObject
Run Code Online (Sandbox Code Playgroud)

现在,在class MyObject,有一个非静态函数,在那里,我使用"我"的引用$this,但我也有另一个对象.

是否有可能在不做的情况下$this = $myObject实现或多或少相同的效果,比如某种类似的东西set_object_vars($this, get_object_vars($myObject))

php properties this assign

17
推荐指数
1
解决办法
1万
查看次数

用于替换非本地列表中的值的赋值

[[<- 在非本地对象上使用时,列表和环境的行为会有所不同:

lst = list()
env = new.env()

(function () lst[['x']] = 1)()
(function () env[['x']] = 1)()
Run Code Online (Sandbox Code Playgroud)
lst
# list()

as.list(env)
# $x
# [1] 1
Run Code Online (Sandbox Code Playgroud)

换句话说,如果目标[[<-是环境,它会修改(非本地)环境,但如果它是矢量/列表,则会创建一个新的本地对象.

我想知道两件事:

  1. 为什么这种行为上的差异?
  2. 有没有一种方法可以实现列表和环境相同的结果,而不使用<<-

关于(1),我知道列表和环境之间存在多种差异(特别是我知道环境不会被复制)但文档中没有提到为什么[[<-两者之间的语义不同 - 特别是为什么运营商将在不同的范围内运作.这是一个错误吗?至少它是反直觉的,并且需要一些非平凡的实现恶作剧.1

关于(2),显而易见的解决方案当然是使用<<-:

(function () lst[['x']] <<- 1)()
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢严格理解差异,而不是仅仅解决它们.此外,我到目前为止使用assign而不是,<<-我更喜欢这个,因为它允许我更好地控制作业的范围(特别是因为我可以指定inherits = FALSE.<<-对我来说太多伏都教了.

但是,上述内容无法解决(据我所知)使用,assign因为assign只适用于环境,而不是列表.特别是,虽然assign('x', 1, env)工作(并且与上面相同),assign('x', 1, lst)但是不起作用.


1 为了详细说明,当然希望R使用动态调度(例如通过S3)对不同的对象类型做不同的事情.但是,这不是 …

environment r list assign

17
推荐指数
1
解决办法
149
查看次数