小编nsh*_*eff的帖子

你能让R打印更详细的错误信息吗?

我经常对R的神秘错误消息感到沮丧.我不是在交互式会话期间谈论,我的意思是当你运行脚本时.错误消息不会打印出行号,并且通常很难跟踪违规行以及错误原因(即使您可以找到该位置).

最近我的R脚本失败了,带来了令人难以置信的深刻信息:"执行停止了." 我通常跟踪这些错误的方法是在整个脚本中放入大量的打印语句 - 但这很痛苦.我有时不得不在交互式会话中逐行浏览脚本以查找错误.

有没有人有更好的解决方案,如何使R错误输出更有用?

编辑:许多R调试的东西适用于交互式会话.我正在寻找有关通过Rscript运行的命令行脚本的帮助.当错误发生时,我不在R会话的中间,我在bash shell.我无法运行"traceback()"

error-handling r

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

禁用/禁止用于R中CRAN镜像选择的tcltk弹出窗口

我的问题类似于之前发布的问题,但从未真正回答过:

在R中禁用GUI,图形设备

我不喜欢用于CRAN镜像选择的R tcltk弹出窗口.当他们在两个包中搜索函数的帮助时,他们还会弹出选择包.

有没有办法在不完全禁用X11的情况下禁用这些窗口?我仍然希望plot()命令正常工作,但禁用永远加载远程连接的小选择菜单.

例如,如果您使用ssh,但不使用-X,那么镜像选择只是R中的文本,您键入一个数字.它很快.这就是我想要的,但保留X11的情节b.

任何人都知道如何维护图形窗口,但禁用"选择"tcltk窗口?

x11 user-interface r popup cran

27
推荐指数
2
解决办法
3514
查看次数

R:你如何合并/组合两个环境?

这是一个简单的问题,但答案显然不是那么简单......是否可以将R中的环境结合起来?

E1 = new.env()
E2 = new.env()
E1$x = 25
E2$y = 7
Run Code Online (Sandbox Code Playgroud)

好的,现在我想要一个E3既有x又有y定义的环境(比方说).

c(E1, E2)
#doesn't work
E3 = new.env(E1, E2)
#doesn't work
Run Code Online (Sandbox Code Playgroud)

我找到了其他类似的问题,但它们似乎对我不起作用.

使用案例:也许有一个原因这并不容易......我想这样做的原因是:我使用一些函数来加载数据.以前,我刚刚将它加载到全局环境中,但我现在有许多不同的函数加载不同类型的数据(我根据需要不同地调用它),因此我希望保持加载的数据更加分区.如果我把2条不同的加载函数E1=loadData1()E2=loadData2(),我现在想调用使用变量来自这两个功能一个功能,我想能说with(E1 & E2, someFunction()).因此,合并我加载的环境似乎是合适的.

那么,合并它们的正确方法是什么?而且,顺便说一下,如果合并环境不是正确的方法,你对如何更好地完成我正在做的事情有不同的建议吗?

environment r

15
推荐指数
3
解决办法
2382
查看次数

是否有R等价的python的字符串`format`函数?

在python中有一个很好的函数(str .format),它可以很容易地用{variable}字符串中的变量(编码为)替换存储在dict中的值(使用变量名称命名的值).像这样:

vars=dict(animal="shark", verb="ate", noun="fish")
string="Sammy the {animal} {verb} a {noun}."
print(string.format(**vars)) 
Run Code Online (Sandbox Code Playgroud)

鲨鱼萨米吃了一条鱼.

什么是最简单的解决方案R?是否有一个内置的等效2参数函数,它接受带有以相同方式编码变量的字符串,并用命名的命名值替换它们list

如果R中没有内置函数,那么已发布的包中是否有一个?

如果已发布的软件包中没有,您会用什么来编写一个?

规则:字符串由编码为"{variable}"的变量提供给您.变量必须编码为a list.我将回答我的定制版本,但会接受一个比我更好的答案.

replace r

12
推荐指数
1
解决办法
3963
查看次数

R data.table':='在直接调用中工作,但是包中的相同功能失败

使用R的data.table包,

这有效:

instruction = "a = data.table(name=1:3, value=1:3, blah=1:3); a[,c('value', 'blah'):=NULL]"
eval(parse(text=instruction))
#   name
#1:    1
#2:    2
#3:    3
Run Code Online (Sandbox Code Playgroud)

这有效:

myFunc = function(instruction) {
eval(parse(text=instruction))
}
myFunc(instruction)
#   name
#1:    1
#2:    2
#3:    3
Run Code Online (Sandbox Code Playgroud)

现在,将此函数放入包中,加载它,然后尝试调用它.这不起作用:

myFuncInPackage(instruction)
#Error in `:=`(c("value", "blah"), NULL) : 
#  Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").
Run Code Online (Sandbox Code Playgroud)

为什么?


编辑:@Roland指出在包Depends字段中添加data.table 使它工作.但是,我不认为这是一个很好的解决方案,因为该软件包并不真正依赖,要求或使用data.table.我只是希望能够在包中使用data.table.

此外,data.table的所有其他功能在函数中运行良好,而不是:=运算符.

所以我想一个后续问题可能是:我应该将data.table添加到我编写的每个包的Depends中,以便data.tables在该包的函数中按预期工作吗?这似乎不正确......解决这个问题的正确方法是什么?

r data.table colon-equals

10
推荐指数
2
解决办法
1997
查看次数

防止文件路径中出现重复斜杠

我想构建一个文件路径,给定文件名和该文件所在的文件夹。该文件夹可能包含尾部斜杠,也可能不包含。在python中,os.path.join为你解决这个问题。这个问题有基本的 R 解决方案吗?如果没有,R 中推荐的构建没有重复斜杠的文件路径的方法是什么?

这工作正常:

> file.path("/path/to/folder", "file.txt")
[1] "/path/to/folder/file.txt"
Run Code Online (Sandbox Code Playgroud)

但是,如果用户提供一个带有尾部斜杠的文件夹,file.path那么仍然有效但令人讨厌的双斜杠是否:

> file.path("/path/to/folder/", "file.txt")
[1] "/path/to/folder//file.txt"
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个内置的 1 函数答案来解决这个常见问题。

r filepath

8
推荐指数
1
解决办法
2137
查看次数

如果基本泊坞窗图像发生变化,相关图像是否会自动更改?

假设我有一个Dockerfile,我使用FROM指令在其中构建基于其他图像的图像.

例如,我的图像,称为extendedImage,开头FROM baseImage,然后只是安装其他东西.

现在,说得baseImage更新.我拉了更新docker pull baseImage.现在,如果我docker run extendedImage,它会反映所做的改变baseImage吗?或者必须首先我docker build extendedImage 再次得到它反映更新baseImage

docker

7
推荐指数
1
解决办法
1957
查看次数

ggplot2:关于列函数的faceting

无法找到答案 - 在ggplot2中,是否可以在列的函数上进行分析,而不是直接对列的值进行分析?

简单可重复的例子:

样本数据:

df=data.frame(dat=c(1,2,5,5,7))
Run Code Online (Sandbox Code Playgroud)

这有效:

ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
       geom_point() + facet_grid(dat ~ .)
Run Code Online (Sandbox Code Playgroud)

这不是:

ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
       geom_point() + facet_grid((dat > 3) ~ .)
Run Code Online (Sandbox Code Playgroud)

一种解决方案是为方面添加一列.这有效:

df$facet=df$dat>3
ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
       geom_point() + facet_grid(facet ~ .)
Run Code Online (Sandbox Code Playgroud)

但有没有办法在不必向data.frame添加新列的情况下执行此操作?

r facet ggplot2

6
推荐指数
1
解决办法
215
查看次数

为什么'with'不通过嵌套函数传递变量范围?

在R中,如果我创建一个环境然后用于with评估该环境中的函数,则该函数通常可以访问变量.但是,如果我嵌套函数,由于某种原因,它们会超出范围.你能解释一下为什么会这样吗?

例:

使用名为的变量创建新环境 x

E = new.env();
E$x = c(1,2,3)
Run Code Online (Sandbox Code Playgroud)

使用with我可以打印这个变量:

with(E, print(x));
#[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

但是现在如果我嵌套这个函数,它就不再起作用了:

printMe = function() { print(x); }
with(E, printMe())
#Error in print(x) : object 'x' not found
Run Code Online (Sandbox Code Playgroud)

我知道我可以让它再次起作用:

printMe = function(x) { print(x); }
with(E, printMe(x))
#[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

但我不明白 - 如果with创建一个环境,为什么嵌套函数看不到x?如果你附上它可以工作:

attach(E)
printMe()
#[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

我想我只是缺少一些关于范围界定的东西,但推荐的方法是什么?或者,以另一种方式提出我的问题:为什么不能在with访问自由变量中嵌套函数?

scope r

5
推荐指数
2
解决办法
180
查看次数

如何控制使用 roxygen2 记录的 R 包中的导入顺序?

roxygen2NAMESPACE将根据我的包文档中的指令自动构建一个文件@import。但显然,我如何排序指令并不重要@import,它总是按字母顺序添加导入。

这给我带来了问题:我正在开发一个需要同时导入IRanges和 的包data.table。这两个包都定义了一个名为 的函数shift,因此导入顺序很重要(shift环境中的函数将来自最后加载的包)。

在我的 roxygen2 代码中,我说:

@import data.table
@import IRanges
Run Code Online (Sandbox Code Playgroud)

我把它放在第一位data.table是因为我希望shift函数 fromIRanges覆盖函数 fromdata.table但行的顺序@import似乎并不重要,因为总是将导入行放入文件roxygen2中。然后我收到这条消息:NAMESPACEIRanges

2:加载时用“data.table::shift”替换先前导入的“IRanges::shift”...

我希望情况正好相反;但实际上,即使我碰巧在这里很幸运,我也不想依赖字母顺序来工作。有什么办法可以控制这个吗?

编辑:我相信data.table是在后面,IRanges因为 theI是大写的。

import r roxygen2

5
推荐指数
0
解决办法
349
查看次数

R函数可以访问自己的名字吗?

你能写一个打印出自己名字的功能吗?

(显然没有硬编码)

r function

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

在Sublime Text 3中,如何更改注释字符?

我喜欢自动评论功能Ctrl + /,但我希望能够随意更改它使用的角色.我看过许多类似的问题这一个,但它不完全是一个通用的解决方案.

如何让评论角色使用不同的东西?具体的用例是我正在编写R代码并使用Roxygen2作为文档.这#'用作注释字符,而不仅仅是#.所以我想设置sublime使用,#'因为我不能将它用于Roxygen2评论.

关于Sublime2的问题,就像这个,引用'.tmPreferences'文件,但我在Sublime 3安装中找不到任何这样的文件.如果答案仍然是这些文件,它们在哪里存储在Sublime 3中?

roxygen2 sublimetext3

3
推荐指数
1
解决办法
1599
查看次数

你如何格式化多行 R 包消息?

在开发 R 包时,我想使用R'smessage()warning()函数为我的包用户生成输出。

有时这些消息可能很长。我可以做到这一点(文字只是一个简单的例子):

message("If you got to this point in the code, it means the matrix was empty. Calculation continues but you should consider re-evaluating an earlier step in the process")
Run Code Online (Sandbox Code Playgroud)

太棒了……但是为了风格,我也希望我的代码行少于 80 个字符,这样它们就可以很好地适应窄屏、GitHub 等。然后我可以使用 IDE 代码重排工具轻松地重新格式化我的消息如果它改变。

所以我试试这个:

message("If you got to this point in the code, it means 
the matrix was empty. Calculation continues but you should consider
 re-evaluating an earlier step in the process")
Run Code Online (Sandbox Code Playgroud)

这解决了我的代码标准——它少于 80 个字符行并且可以按预期回流。但这在我的消息输出中保留了空格,我也不想要:

If you …
Run Code Online (Sandbox Code Playgroud)

string format message r

3
推荐指数
1
解决办法
1244
查看次数