在处理大型代码库时,使用相对路径获取文件很有用.其他编程语言具有明确定义的机制,用于使用相对于所源文件的目录的路径来获取文件.一个例子是Ruby的require_relative.在R中实施相对路径采购的好方法是什么?
下面是我使用各种食谱和R论坛帖子拼凑的一段时间.它对于我的直接开发来说效果很好,但并不健全.例如,特别是在通过testthat库加载文件时它会中断auto_test().rscript_stack()回报character(0).
# Returns the stack of RScript files
rscript_stack <- function() {
Filter(Negate(is.null), lapply(sys.frames(), function(x) x$ofile))
}
# Returns the current RScript file path
rscript_current <- function() {
stack <- rscript_stack()
r <- as.character(stack[length(stack)])
first_char <- substring(r, 1, 1)
if (first_char != '~' && first_char != .Platform$file.sep) {
r <- file.path(getwd(), r)
}
r
}
# Sources relative to the current script
source_relative <- function(relative_path, ...) {
source(file.path(dirname(rscript_current()), relative_path), …Run Code Online (Sandbox Code Playgroud) 如何在不更改ruby中的类的情况下向异常消息添加信息?
我目前使用的方法是
strings.each_with_index do |string, i|
begin
do_risky_operation(string)
rescue
raise $!.class, "Problem with string number #{i}: #{$!}"
end
end
Run Code Online (Sandbox Code Playgroud)
理想情况下,我还想保留回溯.
有没有更好的办法?
Devise身份验证框架在任何地方都使用闪存通知.这使得与应用程序集成变得容易,但有时会导致糟糕的用户体验.
我想知道在我的Rails 3应用程序中选择性地关闭一些Devise flash通知的简单方法.特别是,我想摆脱明显明显的signed_in和signed_out闪烁.
一些搜索建议继承会话控制器或使用类似的东西,但我无法找到任何简单的解决方案来解决这个问题.
假设df1并且df2是DataFrameApache Spark 中的两个,使用两种不同的机制计算,例如,Spark SQL与Scala/Java/Python API.
是否存在一种惯用的方法来确定两个数据帧是否相等(相等,同构),其中等价由数据确定(每行的列名和列值)是否相同,除了行和列的排序?
这个问题的动机是,通常有很多方法来计算一些大数据结果,每种方法都有自己的权衡.在探讨这些权衡时,重要的是要保持正确性,因此需要检查有意义的测试数据集的等效性/相等性.
R具有按值传递的语义,可以最大限度地减少意外的副作用(这是一件好事).然而,当代码被组织成许多用于可重用性/可读性/可维护性的函数/方法时,并且当代码需要通过例如大数据帧来操纵大数据结构时,通过一系列转换/操作,传递值语义引导大量复制数据和堆积颠簸(一件坏事).例如,一个数据帧需要50Mb的上作为函数参数将至少要复制的相同的次数作为在调用堆栈的底部的函数调用深度和堆的大小为N传递堆*50MB.如果函数从调用链的深处返回转换/修改的数据帧,则复制由另一个N上升.
SO问题避免传递数据框的最佳方法是什么?触及这个主题,但是以避免直接询问传递参考问题的方式表达,并且获胜的答案基本上说,"是的,值传递是R如何工作".这实际上不是100%准确.R环境支持传递引用语义,而诸如proto之类的 OO框架广泛使用此功能.例如,当一个proto对象作为函数参数传递,而它的"魔术包装"通过值传递给R开发人员时,语义是传递引用.
似乎通过引用传递大数据框架将是一个常见问题,我想知道其他人是如何接近它的,以及是否有任何库可以实现这一点.在我的搜索中,我没有发现一个.
如果没有可用的东西,我的方法是创建一个包装数据框的proto对象.我希望有关应该添加到此对象的语法糖的指针,以使其有用,例如,重载$和[[运算符,以及我应该注意的任何陷阱.我不是R专家.
与类型无关的传递参考解决方案的加分点与R很好地集成,尽管我的需求仅限于数据帧.
开发人员和API文档都不包含有关可以传入哪些选项的任何参考,DataFrame.saveAsTable或者DataFrameWriter.options它们会影响Hive表的保存.
我希望在这个问题的答案中,我们可以汇总对Spark开发人员有用的信息,他们希望能够更好地控制Spark如何保存表格,并且可能为改进Spark的文档提供基础.
在将状态与Either进行整合(幻灯片88)时,给定State分层下的模式Either,是否有建议的方法来添加另一种类型的状态,例如,通过类似的方式记录Writer?看来新的国家有现有之间的生活State和Either为了利用快速失败行为Either中flatMap.
下面是演示代码的可运行示例,调整为使用Scalaz 7.2.8在2.11.8上工作.有没有一种方法可以在现有行为的基础上干净地添加新的monad变换器,简化了重构?在Scalaz中堆叠StateT适用于堆叠,但不处理由故障快速flatMap行为创建的排序问题Either.
// Based on slide 88+ in https://speakerdeck.com/mpilquist/scalaz-state-monad
// Adjusted for Scala 2.11 (invariant A), Scalaz 7.2 (Pointed->Applicative) and Throwable on lhs of Either
object IntegratingStateAndEither {
import scalaz._
import scalaz.Scalaz._
import EitherT._
import scalaz.StateT.stateMonad
type QueryStateS[A] = State[QueryState, A]
type ET[F[_], A] = EitherT[F, Throwable, A]
type QueryStateES[A] = ET[QueryStateS, A]
object QueryStateES …Run Code Online (Sandbox Code Playgroud) Apache Spark DataFrameReader.json()可以自动处理gzip压缩的JSONlines文件,但似乎没有办法DataFrameWriter.json()编写压缩的JSONlines文件.额外的网络I/O在云中非常昂贵.
有没有解决这个问题的方法?
我想创建相当于:
def toTupleN[A1, ..., AN, L <: HList](l: L): TupleN[A1, ..., AN]
Run Code Online (Sandbox Code Playgroud)
代码使用toTupleN只有在只有一个N值组合时才能编译l,因为可以从中创建元组.其他任何东西都应该生成编译时错误.应考虑可用的隐式转换.请注意,对其中l的值的大小或顺序没有限制.
例:
val l = 23 :: (1, "wibble") :: (2, "wobble") :: "foo" :: HNil
// l: shapeless.::[Int,shapeless.::[(Int, String),shapeless.::[(Int, String),shapeless.::[String,shapeless.HNil]]]] = 23 :: (1,wibble) :: (2,wobble) :: foo :: HNil
val t2: (String, Int) = toTuple2(l)
// t2: (String, Int) = (foo,23)
val nope: (String, String) = toTuple2(l)
// Compiler error because no combination of l's values can create …Run Code Online (Sandbox Code Playgroud) Homebrewcask在Mac OS X上做了一些连接魔术的app.显然它不够好,因为Selenium WebDriver正在寻找Firefox可执行文件找不到它.以下是驱动Selenium 的RSpec测试运行中的错误消息Capybara.
提示Firefox可执行文件的位置有什么好方法?
Failure/Error: Unable to find matching line from backtrace
Selenium::WebDriver::Error::WebDriverError:
Could not find Firefox binary (os=macosx). Make sure Firefox is installed or set the path manually with Selenium::WebDriver::Firefox::Binary.path=
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/binary.rb:127:in `path'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/binary.rb:60:in `execute'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/binary.rb:34:in `start_with'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/launcher.rb:70:in `start_silent_and_wait'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/launcher.rb:35:in `block in launch'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/socket_lock.rb:20:in `locked'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/launcher.rb:32:in `launch'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/firefox/bridge.rb:24:in `initialize'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/common/driver.rb:31:in `new'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver/common/driver.rb:31:in `for'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/selenium-webdriver-2.43.0/lib/selenium/webdriver.rb:67:in `for'
# /Users/mende/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0/gems/capybara-2.4.4/lib/capybara/selenium/driver.rb:13:in `browser'
Run Code Online (Sandbox Code Playgroud) scala ×4
apache-spark ×3
dataframe ×3
r ×2
capybara ×1
compression ×1
data.table ×1
devise ×1
either ×1
exception ×1
gzip ×1
hadoop ×1
hive ×1
hlist ×1
homebrew ×1
parquet ×1
performance ×1
proto ×1
rdd ×1
ruby ×1
scalaz ×1
selenium ×1
shapeless ×1
state-monad ×1
tuples ×1