我经常对R的神秘错误消息感到沮丧.我不是在交互式会话期间谈论,我的意思是当你运行脚本时.错误消息不会打印出行号,并且通常很难跟踪违规行以及错误原因(即使您可以找到该位置).
最近我的R脚本失败了,带来了令人难以置信的深刻信息:"执行停止了." 我通常跟踪这些错误的方法是在整个脚本中放入大量的打印语句 - 但这很痛苦.我有时不得不在交互式会话中逐行浏览脚本以查找错误.
有没有人有更好的解决方案,如何使R错误输出更有用?
编辑:许多R调试的东西适用于交互式会话.我正在寻找有关通过Rscript运行的命令行脚本的帮助.当错误发生时,我不在R会话的中间,我在bash shell.我无法运行"traceback()"
我的问题类似于之前发布的问题,但从未真正回答过:
我不喜欢用于CRAN镜像选择的R tcltk弹出窗口.当他们在两个包中搜索函数的帮助时,他们还会弹出选择包.
有没有办法在不完全禁用X11的情况下禁用这些窗口?我仍然希望plot()命令正常工作,但禁用永远加载远程连接的小选择菜单.
例如,如果您使用ssh,但不使用-X,那么镜像选择只是R中的文本,您键入一个数字.它很快.这就是我想要的,但保留X11的情节b.
任何人都知道如何维护图形窗口,但禁用"选择"tcltk窗口?
这是一个简单的问题,但答案显然不是那么简单......是否可以将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()).因此,合并我加载的环境似乎是合适的.
那么,合并它们的正确方法是什么?而且,顺便说一下,如果合并环境不是正确的方法,你对如何更好地完成我正在做的事情有不同的建议吗?
在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.我将回答我的定制版本,但会接受一个比我更好的答案.
使用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在该包的函数中按预期工作吗?这似乎不正确......解决这个问题的正确方法是什么?
我想构建一个文件路径,给定文件名和该文件所在的文件夹。该文件夹可能包含尾部斜杠,也可能不包含。在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 函数答案来解决这个常见问题。
假设我有一个Dockerfile,我使用FROM指令在其中构建基于其他图像的图像.
例如,我的图像,称为extendedImage,开头FROM baseImage,然后只是安装其他东西.
现在,说得baseImage更新.我拉了更新docker pull baseImage.现在,如果我docker run extendedImage,它会反映所做的改变baseImage吗?或者必须首先我docker build extendedImage 再次得到它反映更新baseImage?
无法找到答案 - 在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中,如果我创建一个环境然后用于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访问自由变量中嵌套函数?
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是大写的。
在开发 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) r ×11
roxygen2 ×2
colon-equals ×1
cran ×1
data.table ×1
docker ×1
environment ×1
facet ×1
filepath ×1
format ×1
function ×1
ggplot2 ×1
import ×1
message ×1
popup ×1
replace ×1
scope ×1
string ×1
sublimetext3 ×1
x11 ×1