有没有办法在两个向量上使用mapply来构造命名列表?第一个向量是类型character
,包含用于列表的名称,而第二个包含值.
到目前为止,我唯一的解决方案是:
> dummyList = list()
> addToList <- function(name, value) {
+ dummyList[[name]] <- value
+ }
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2))
$foo
`1`
$bar
`2`
Run Code Online (Sandbox Code Playgroud)
这似乎是一个相当人为的解决方案,但我无法弄清楚如何做到这一点.我遇到的问题是:
它需要创建dummyList
即使dummyList
永远不会改变,并且在调用之后是一个空列表mapply
.
如果数字向量,,, c(1, 2)
没有转换为列表,则调用的结果mapply
是双精度命名向量.
为了解决问题2,我总是可以调用mapply
两个向量然后调用as.list
结果,但似乎应该有一种方法可以直接创建一个值在向量中的列表.
我想gsub
用2个反斜杠替换字符串中每个出现反斜杠的情况.
目前,我所尝试的是gsub("\\\\", "\\", x)
.这似乎不起作用.但是,如果我更改表达式而不是用"a"替换每个反斜杠,它可以正常工作.
> gsub("\\\\", "\\", "\\")
[1] ""
> gsub("\\\\", "a", "\\")
[1] "a"
> gsub("\\\\", "\\\\", "\\")
[1] "\\"
Run Code Online (Sandbox Code Playgroud)
最后一个字符只有一个反斜杠; R只打印2,因为它使用反斜杠打印转义字符.使用nchar
确认长度为1.
是什么导致这个功能?第二个参数gsub
不是正则表达式,因此在字符串文字中有4个反斜杠应该转换为带有2个反斜杠的字符.gsub
上面的第一个调用返回一个空字符串更没意义.
在R中,是否有类似函数read.csv
读取文件,其中标题位于左侧(或右侧)而不是顶部,数据是从左到右组织的?
所以数据看起来像:
var1,1,2,3,4,5
Run Code Online (Sandbox Code Playgroud)
看看文档,read.table
并read.csv
没有似乎突然出现.我看到使用这些函数的最佳选择是使用read.table
然后构造另一个表,其列是原始数据的行,依此类推.
有一种使用的一种方式format
的日期对象上的功能,特别是类的一个对象POSIXlt
,POSIXct
或者Date
,与该格式%Y, %m, %d
使得前导零从每个那些3个字段的剥离?
例如,我想format(as.Date("1998-09-02"), "%Y, %m, %d")
回来1998, 9, 2
而不是1998, 09, 02
.
作为R是函数式语言的症状,可以使用纯函数符号指定许多控制结构.例如,if语句:
> as.list((substitute(if(a == 1) 1 else 2)))
[[1]]
`if`
[[2]]
a == 1
[[3]]
[1] 1
[[4]]
[1] 2
> as.list(substitute(`if`(a == 1, 1, 2)))
[[1]]
`if`
[[2]]
a == 1
[[3]]
[1] 1
[[4]]
[1] 2
Run Code Online (Sandbox Code Playgroud)
出于好奇,我试图对函数定义做同样的事情.函数通常使用function(args) body
语法构造,但也存在一个以function
R 命名的函数.我遇到的问题是函数的未评估定义将包含一个pairlist:
> substitute(function(x = 1, a) {x + a})[[2]]
$x
[1] 1
$a
[empty symbol]
Run Code Online (Sandbox Code Playgroud)
第二个参数是参数名称和默认值之间的一个参数,它们可能是空符号.据我所知,仅使用手动调用就不可能将列表或pairlist作为表达式的一部分传递.以下是我的尝试:
> substitute(`function`(x, {x + 1}))
Error: badly formed function expression
> substitute(`function`((x), {x + 1}))
function(`(`, x) {
x + …
Run Code Online (Sandbox Code Playgroud) 我正在玩R并注意到围绕函数调用的全局环境与实际全局环境不同的一些不一致.
考虑以下:
> test = function ()
+ {
+ print(environmentName(as.environment(-1)))
+ print(ls(as.environment(-1)))
+ print(environmentName(.GlobalEnv))
+ print(ls(.GlobalEnv))
+ as.environment(-1)
+ }
> foo = 1
> ls()
[1] "foo" "test"
> test()
[1] ""
[1] "doTryCatch" "expr" "handler" "name" "parentenv"
[1] "R_GlobalEnv"
[1] "foo" "test"
<environment: R_GlobalEnv>
Run Code Online (Sandbox Code Playgroud)
在函数调用中,as.environment(-1)
返回声称它的环境<environment: R_GlobalEnv>
但是在调用environmentName
所述环境时,其名称是空字符.此外,它的内容不同于真实的全球环境.到底发生了什么?
我首先注意到mget
在调用中使用的错误,因为无法找到全局定义的变量.这似乎是违反直觉的,因为通常在引用函数内的变量时,R将在封闭环境中向上搜索,直到找到变量的定义,包括全局环境.
在运算符优先级的标准R帮助页面上,它们不包括函数调用,在我看来这似乎相当草率.这导致了一些问题,所以我决定只使用反复试验,substitute
并发现优先级似乎介于[[
和之间^
:
> substitute(a^b())[[1]]
`^`
> substitute(a[b]())[[1]]
a[b]
Run Code Online (Sandbox Code Playgroud)
在中缀表示法中,这些将是(^ a (b ()))
和(([ a b) ())
(表示呼叫操作符为()
).在简单的英语中,第一个示例显示在参数上调用指数函数a
,b()
而在第二个示例中,最终结果是对函数的调用a[b]
.
这种优先权在每种情况下都适用吗?看起来奇怪的是,函数调用的优先级不会是常量,但如果它确实是常量的话,它就不会包含在上面的帮助页面中.
在R中,公式对象是符号的,似乎很难解析.但是,我需要将这样的公式解析为一组明确的标签,以便在R之外使用.
(1)
让我们来f
表示未指定响应的模型公式,例如~V1 + V2 + V3
,我尝试过的一件事是:
t <- terms(f)
attr(t, "term.labels")
Run Code Online (Sandbox Code Playgroud)
但是,如果某些变量f
属于分类,则不能得到完全明确的含义.例如,V1
设为具有2个类别的分类变量,即布尔值,并V2
设为double.
因此,指定的模型~V1:V2
应具有2个参数:"intercept"和"xyes:z".同时,指定的模型~V1:V2 - 1
应具有参数"xno:z"和"xyes:z".但是,没有办法告诉函数terms()
哪些变量是分类的(以及有多少类别)无法解释这些变量.相反,它只是V1:V2
在其"terms.labels"中,它并不意味着在上下文中V1
是绝对的.
(2)
另一方面,使用model.matrix
是一种简单的方法来获得我想要的.问题是它需要一个data
参数,这对我不好,因为我只想要在R之外使用符号公式的明确解释.这种方法会浪费很多时间(相对而言),因为R必须阅读来自外部来源的数据,当它真正需要知道公式时,哪些变量是分类的(以及多少类别)和哪些变量是双精度的.
有没有办法使用'model.matrix'只指定数据类型而不是实际数据?如果没有,还有什么是可行的解决方案?
给定一个环境x
,一个方便的简写assign(x, value, envir = e)
就是写e[[x]] <- value
.目前,对于一次分配多个对象的子集运算符没有模拟:
> e = new.env(parent = emptyenv())
> e[["a"]] <- 1
> ls(e)
[1] "a"
> e[c("b", "c")] <- c(1,2)
Error in e[c("b", "c")] <- c(1, 2) :
object of type 'environment' is not subsettable
Run Code Online (Sandbox Code Playgroud)
我希望使用内置的S3功能来编写一个[<-
.我注意到的第一个古怪的是,这两个[[<-
和[<-
是原始的功能,尽管模仿S3功能:
> methods("[<-")
[1] [<-.data.frame [<-.Date [<-.environment [<-.factor [<-.POSIXct [<-.POSIXlt [<-.raster* [<-.ts*
Run Code Online (Sandbox Code Playgroud)
通常,S3函数具有body只是调用的格式UseMethod
.例如:
> summary
function (object, ...)
UseMethod("summary")
<bytecode: 0x1a7c3a8>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)
除了赋值运算符是原始的,[[<- …
根据PEP标准,缩进应该在二进制运算符之前。此外,多行条件应放在括号内,以避免在换行符前使用反斜杠。这两个约定导致以下情况
if (long_condition_1
or long_condition_2):
do_some_function()
Run Code Online (Sandbox Code Playgroud)
该代码反过来E129 visually indented line with same indent as next logical line
在PEP8中中断。但是,第二行必须缩进四个空格,否则,对于缩进或缩进过的行,它会破坏E128或E127。
如何格式化上面的一种,使其符合PEP8标准?
r ×9
coding-style ×1
constructor ×1
csv ×1
date ×1
environment ×1
expression ×1
formula ×1
function ×1
gsub ×1
lapply ×1
list ×1
named ×1
parsing ×1
pep8 ×1
python ×1
r-s3 ×1
read.table ×1
regex ×1
zero-pad ×1