更新2 @G.格洛腾迪克发布了两种方法.第二个是改变函数内的函数环境.这解决了我的编码重复过多的问题.在将脚本编写成包时,我不确定这是否是通过CRAN检查的好方法.当我得出一些结论时,我会再次更新.
更新
我试图传递很多输入参数变量,f2并且不想索引函数内的每个变量env$c, env$d, env$calls,这就是我尝试使用within f5和f6(修改过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) 我正在尝试为包含的模板动态分配控制器,如下所示:
<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语法:逗号是什么意思?
我在阅读本文时遇到了代码(执行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
我读了这个关于重命名对象的基本问题和@Shane对它的回答,指着我懒惰的评价.现在我想知道是否assign也懒得评价.就像这里一样:
assign("someNewName",someOldObject)
rm(someOldObject)
Run Code Online (Sandbox Code Playgroud)
为什么我想知道这样做的原因是以下用例:假设我有10K + R对象各自有两个属性叫originalName和additionalName.现在我想编写一个函数,可以有效地让用户从一个名称切换到另一个名称,而不会丢失这两个属性.粗略喜欢这个......
编辑:基于@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).
我创建了一个生成矩阵的函数,但是我无法弄清楚如何在函数环境之外使这个函数的输出可用,所以我可以将它保存在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)
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) 我正在努力使用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使用功能label从Hmisc包.我可以像这样一个接一个地做,然后检查结果:
> 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) 假设我有一个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)
有任何想法吗?谢谢.
我正在使用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,我可以在以后锁定它(这似乎不是一个好习惯)
所以基本上我有两个问题:
assignInNamespace在包命名空间(应该被锁定)的情况下究竟做了什么非常感谢您在那里分享您的经验.
编辑:对此问题感兴趣的人可能会发现此博客文章非常有趣.
我有一个PHP类型的对象MyObject.
$myObject instanceof MyObject
Run Code Online (Sandbox Code Playgroud)
现在,在class MyObject,有一个非静态函数,在那里,我使用"我"的引用$this,但我也有另一个对象.
是否有可能在不做的情况下$this = $myObject实现或多或少相同的效果,比如某种类似的东西set_object_vars($this, get_object_vars($myObject))?
[[<- 在非本地对象上使用时,列表和环境的行为会有所不同:
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),我知道列表和环境之间存在多种差异(特别是我知道环境不会被复制)但文档中没有提到为什么[[<-两者之间的语义不同 - 特别是为什么运营商将在不同的范围内运作.这是一个错误吗?至少它是反直觉的,并且需要一些非平凡的实现恶作剧.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)对不同的对象类型做不同的事情.但是,这不是 …
assign ×10
r ×6
function ×2
javascript ×2
angularjs ×1
arrays ×1
controller ×1
dataframe ×1
dynamic ×1
environment ×1
field ×1
hmisc ×1
labels ×1
list ×1
matlab ×1
namespaces ×1
package ×1
php ×1
properties ×1
struct ×1
this ×1