运行后:
x <- as.name("aa")
aa <- 2
Run Code Online (Sandbox Code Playgroud)
在R中,为什么不呢
(x)
Run Code Online (Sandbox Code Playgroud)
返回2?为什么不呢
x <- as.name("aa")
aa <- 3
get(get(x))
Run Code Online (Sandbox Code Playgroud)
回来3?
我知道get()需要一个字符串,但我不明白为什么它不评估x,在里面找到字符串,然后得到它.在我看来,有时函数会对它们的参数进行这样的评估,有时它们却没有.例如,在第二个示例中,如果使用eval(x)替换get(get(x)),则eval()会计算x以查找名称,然后计算名称以查找3.
我想将一个特殊修改的函数添加到其他人编写的包中,使用R脚本,即仅用于会话,而不是永久性的.比方说,具体的例子是bls_map_county2()添加到blscrapeR包中. 为了更改一些地图绘制参数,bls_map_county2它只是bls_map_county()带有附加...参数的函数的副本.我还没有插入其他参数.按原样运行函数,我收到错误:
BLS_map_county出错(map_data = df,fill_rate ="unemployed_rate",:找不到函数"geom_map"
我假设这是因为我的函数没有指向blscrapeR命名空间.如何将我的功能分配给(已安装,加载)blscrapeR命名空间,还有什么我需要做的让它从它需要的包中访问任何机器吗?
将这个问题的逻辑与的逻辑相匹配时,我遇到了一些麻烦dplyr。通常,如果要将组减少为每个组一个数字,请使用summarise;如果要为每行计算一个单独的数字,请使用mutate。但是,如果要对每一行的组进行计算怎么办?
在下面的示例中,mloc包含一个指向的指针pnum,目标是添加一个新列nm_child,该列针对每一行计算mloc指向组内行(即具有与该行相同的值)的组内值的数量pnum中的索引。如果使用嵌套循环,或者map如果我知道如何对每个组进行迭代1),按每个元素进行2)和3)将映射输出作为组中的列返回,则将很容易做到这一点。
library(tidyverse)
ser <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2)
pnum <- c(1:5, 1:6)
mloc <- c(0, 2, 2, 0, 3, 1, 1, 0, 0, 3, 4)
tb1 <- tibble(ser,pnum, mloc)
tb2 <- tb1 %>%
group_by(ser) %>%
mutate(nm_child = sum(pnum == mloc))
Run Code Online (Sandbox Code Playgroud)
上面的值nm_child始终=1。我明白了为什么它不起作用,但是我看不出为什么它能起作用。
我也试过
mutate(nm_child = count(pnum == mloc))
Run Code Online (Sandbox Code Playgroud)
(返回
no applicable method for 'groups' applied …Run Code Online (Sandbox Code Playgroud) 在R语言中,假设我有一个函数ff(jj,kk,mm).我希望调用函数(或调用人在交互式会话中)能够在调用时使jj和kk以任意方式取决于mm.
具体而言,假设:
ff <- function(jj, kk, mm){
xx <- jj + kk
out<- xx/mm
out
}
Run Code Online (Sandbox Code Playgroud)
然后在运行时,我想设置mm <- jj*kk.即:
ff(2, 3, (jj*kk))
Run Code Online (Sandbox Code Playgroud)
这会产生:
Error in ff(2, 3, (jj * kk)) : object 'jj' not found
Run Code Online (Sandbox Code Playgroud)
mm在评估之前,即在成功评估之后jj,不会抛出此错误kk.因此,他们将使用不同的范围规则进行第二次评估.我知道这是R标准范围.我问,我可以用这样的方式编写函数,它允许我递给一个简单的数字,或者其他形式参数的函数,只要这些参数在mm需要之前已经或者可以被评估了
吗?
请注意,我不是在问我是否应该这样做.对于后一个问题提出意见的人,我会坚决地假装礼貌.
我也不会问我是否可以预先计算jj并预先计算出预先消化的数字.我知道这是一个看似合理的答案,但由于我已经简化了问题,它不起作用.
我有一个名为的对象defaultPacks,包含我使用的所有计算机上安装的软件包的名称.很多缩写:
defaultPacks <- c(
"AER",
"plyr",
"dplyr"
)
Run Code Online (Sandbox Code Playgroud)
我想将此对象保存到共享目录中的文件,所有这些目录都可以到达.我正在使用Dropbox,当R运行时,同步始终暂停.
save(defaultPacks,
file.path("C:","Users","andrewH","Dropbox","R_PROJ","sharedSettings.rdata"))
Run Code Online (Sandbox Code Playgroud)
然后我想加载对象并安装其名称在对象中的包defaultPacks.
SyncPacks <- function(fileString){
defaultPacks <- load(file=fileString)
install.packages(defaultPacks, repos="http://cran.us.r-project.org")
}
SyncPacks(file.path("C:","Users","andrewH","Dropbox","R_PROJ","sharedSettings.rdata")
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我会收到警告:
Warning in install.packages: package ‘defaultPacks’ is not available (for R version 3.2.1)
Run Code Online (Sandbox Code Playgroud)
我defaultPacks加载并分配后立即查看内容:字符串"defaultPacks".所以它似乎只是一个字符串而不是一个对象.
所以我回到我的保存,然后尝试
save(get(defaultPacks), file.path(etc.))
Run Code Online (Sandbox Code Playgroud)
这给了我一个不同的错误:
Error in save(get("defaultPacks"), file = file.path("C:", "Users", "andrewH", :
object ‘get("defaultPacks")’ not found.
Run Code Online (Sandbox Code Playgroud)
然后我试着dynGet()用同样的结果.
因此,在将符号视为字符串之前,现在它将函数视为字符串.
所以我尝试使用list选项进行保存:
save(list = defaultPacks, file = file.path(etc))
Run Code Online (Sandbox Code Playgroud)
并得到另一个错误:
Error in save(list = defaultPacks, file = …Run Code Online (Sandbox Code Playgroud) 这就是我一直认为省略号在嵌套函数中工作的方式:当你通过省略号将一组参数传递给一个函数时,调用堆栈上它的任何辅助函数都可以得到那些参数 - 我想,通过它自己的省略号.我相信参数传递给省略号累积,因此最里面的省略号包含在调用堆栈中优于它的任何函数中通过省略号参数传递的所有参数.
但我刚做了一个实验来证实这一点,现在看来我错了.从而:
> f02 <- function(...){
+ vv <- list(...)
+ print(vv)
+ }
> f01 <- function(...){
+ f02(b = 2)
+ }
> f01(a=1)
$`b`
[1] 2
Run Code Online (Sandbox Code Playgroud)
这里的内部省略号似乎没有a=1从外部省略号继承参数.
所以我目前的理论是,当你把它请求的内容的动作…,如list(…),match.call(expand.dots=TRUE)或者as.list(substitute(list(...)))[-1],你只能得到的第一个实例…中遇到的是,基于在正常的范围规则搜索路径上.但我不得不说,这对我来说似乎不太可能.如果确实如此,那么,例如,如果其中一个中间函数具有…参数,则提供给绘图函数的几个调用的图形参数将遭受神秘的失败.
所以我想知道是否有一些特殊的规则来确定点点阵中寻找的范围,比如寻找一个优越的实例,如果本地一个是空的,或者如果你寻找…一个特定的命名参数,比如说list(...)$my_parameter,做找不到它.这些解决方案都没有让我觉得非常合理,但是,我没有想到的那些解决方案.
以前关于这个主题的问题似乎主要集中在各种边缘案例上.我正在寻找更多理解正常情况下的传递规则(但可能有多层调用).
我经常不确定图形对象的数据、属性和其他组件的哪些元素ggplot2由哪些其他元素继承,以及向下流动到例如几何对象的默认值源自何处。在特定情况下,这些问题通常可以通过仔细阅读哈德利的书来回答ggplot2。但我发现在 中对继承的整体流程进行某种可视化很有用ggplot2,我想知道是否有人见过、创建过或知道如何创建这样的东西。同样,在一个规范级别(如 aes 或主题)中出现并由另一个级别(如 geom 或比例)继承的默认值的紧凑列表对我来说非常有用,我怀疑许多人学习如何使用 ggplot2。
我会接受以下任何一个答案:
我有一个函数,它将函数列表作为参数.
library(moments)
library(plyr)
tests <- list(mean, varience, skewness, kurtosis)
f <- function(X, tests){
out <- each(... = tests)(X) #each from plyr
names(out) <- GetNames(tests)
out
}
Run Code Online (Sandbox Code Playgroud)
我想GetNames获取对象列表,在本例中为函数,并将对象的名称作为文本返回.理想情况下,我想GetNames使用任何命名对象列表:
> GetNames(tests)
[1] "mean" "varience" "skewness" "kurtosis"
Run Code Online (Sandbox Code Playgroud)
as.character(tests) 返回每个函数的代码文本,而不是它们的名称.
我试过了:
GN <- function(X) deparse(substitute(X))
GetNames <- function(X) lapply(tests, GN)
GetNames(tests)
Run Code Online (Sandbox Code Playgroud)
但这回归:
[[1]]
[1] "X[[i]]"
[[2]]
[1] "X[[i]]"
[[3]]
[1] "X[[i]]"
[[4]]
[1] "X[[i]]"
Run Code Online (Sandbox Code Playgroud)
在编写R代码时,我经常遇到这个问题的一些版本.我想要一个函数来评估它的参数的一些步骤,这里从tests它的对象的名称开始一步,然后停止并让我对结果做一些事情,这里将它们转换为字符串,而不是继续得到所指的对象我可以抓住它们之前的名字(名字).
r ×8
evaluation ×3
scope ×3
arguments ×2
names ×2
scoping ×2
callstack ×1
dictionary ×1
dplyr ×1
dynamic ×1
function ×1
ggplot2 ×1
inheritance ×1
iteration ×1
namespaces ×1
package ×1
substitution ×1
symbols ×1
tidyverse ×1